Golang学习之net/http包
来源:互联网 发布:windows视频播放器 编辑:程序博客网 时间:2024/05/21 22:56
使用net/http包快速创建一个HTTP服务器。
// file http_test1.gopackage main import ( "fmt" "net/http" "log")func HandleIndex(w http.ResponseWriter, r *http.Request) { r.ParseForm() fmt.Println("PATH: ", r.URL.Path) fmt.Println("SCHEME: ", r.URL.Scheme) fmt.Println("METHOD: ", r.Method) fmt.Println() fmt.Fprintf(w, "<h1>Index Page</h1>")}func main() { http.HandleFunc("/", HandleIndex) err := http.ListenAndServe(":8000", nil) if err != nil { log.Fatal("ERROR: ", err) }}
其实有时候语言无关紧要,原理大抵相同。此handler就如同Python的WSGI协议application(environ, start_response)
,如同Nodejs的callback(req,res)
函数。并且他们底层都是基于socket(好像是的!!!)
$ go run http_test1.go
在浏览器中输入127.0.0.1:8000可以看到浏览器显示:
在终端上打印出如下信息:
虽然我们没有像其他语言一样显式地监听端口,启动服务器,或者用socket来搭建tcp或udp服务器,用while循环来获取请求数据。但是我们不难发现服务的入口在http.ListenAndServe
。我们来看一下源码,探讨它究竟做了什么工作。
$ godoc -src net/http ListenAndServe
会打印出来两个相似的函数:
func (srv *Server) ListenAndServe() error { addr := srv.Addr if addr == "" { addr = ":http" } ln, err := net.Listen("tcp", addr) if err != nil { return err } return srv.Serve(tcpKeepAliveListener{ln.(*net.TCPListener)})}func ListenAndServe(addr string, handler Handler) error { server := &Server{Addr: addr, Handler: handler} return server.ListenAndServe()}
不要觉得这两个同名的函数像C++或Java一样是重载函数,Go语言中是没有函数签名这个概念的。
第一个函数func (srv *Server) ListenAndServe() error
,这是type Server struct
类型的一个方法,你可以理解为面向对象中的方法,属于Server类。
而第二个函数func ListenAndServe(addr string, handler Handler) error
则是一个普通函数,内部进行封装,更简洁地实现HTTP服务器。你可以看到它创建了Server类的一个对象,然后调用了刚才说的第一个函数。
转自:http://blog.csdn.net/cc7756789w/article/details/51014076
- Golang学习之net/http包
- Golang学习之net/http 包使用模式
- Golang学习之net包介绍
- Golang学习之net包详解
- golang net/http包使用
- golang中net/http包用法
- golang中net/http包用法
- golang包学习之sync
- Golang中net/http包源码分析与解释
- golang-net/http源码分析之http server
- golang的http包笔记
- golang 中的http包详解
- golang 中的http包详解
- golang log包学习
- golang学习--fmt包
- golang中net包用法
- golang net包基础解析
- golang net/http源码解读
- JavaScript基础之koa
- 还记得高中时奋斗的模样吗?
- 一元多项式加乘运算
- ajax 循环下拉列表及默认选择
- LBP等价模式
- Golang学习之net/http包
- 数据结构思维 第十一章 `HashMap`
- 【VIVADO使用2】如何手动修改hdf文件
- VS2013 + QT5.7.0静态编译 错误 .NMAKE:fatal error U1077. return code 0x2,使用 类 模板 需要 模板 参数列表
- 设半径r=1.5,圆柱高h=3,求圆
- 使用泛型的好处是什么
- iOS 打印 AQDefaultDevice (173): skipping input stream 问题
- java static 精准解读
- maven报错: dynamic web module 3.1 requires java 1.7 or newer