golang的http包笔记
发布时间:2020-12-16 18:36:16 所属栏目:大数据 来源:网络整理
导读:最近打算用golang做项目,看了一下golang的资料,顺便做一下笔记,以供参考,复习. 由于对golang的熟悉度还不是很高,写的有点生疏了,也希望能对大家有帮助吧. 示例源码: package main import ( "log" "net/http" ) func helloWorld( whttp . ResponseWriter , r
最近打算用golang做项目,看了一下golang的资料,顺便做一下笔记,以供参考,复习.
由于对golang的熟悉度还不是很高,写的有点生疏了,也希望能对大家有帮助吧.
示例源码:
packagemain import(
"log"
"net/http" )
func helloWorld(whttp.ResponseWriter,r*http.Request){ w.Write([]byte("hello,world!")) }
func main(){ http.HandleFunc("/",sayHelloName) err:=http.ListenAndServe(":8080",128); background-color:inherit">nil) iferr!=nil{ log.Fatal("ListenAndServe:",err) }
http.HandleFunc() 解读 func HandleFunc(pattern string, handlerfunc(ResponseWriter,192); background-color:inherit"> *Request)) { DefaultServeMux.HandleFunc(pattern,192); background-color:inherit"> handler) } DefaultServeMux的结构如下: typeServeMuxstructmu sync.RWMutex m map[string]muxEntry hostsbool//whetheranypatternscontainhostnames muxEntryexplicitbool h Handler pattern string }
DefaultServeMux是一个全局变量在server.go的 1595 行创建的 NewServeMux() *ServeMux {return &ServeMux{m:make(string]muxEntry)} } var DefaultServeMux = NewServeMux() 再跟进Handle函数接着跟进 DefaultServeMux.HandleFunc(pattern, handler)(mux *ServeMux)mux.Handle(pattern,192); background-color:inherit"> HandlerFunc(handler)) Handle(pattern Handler)mux.mu.Lock() // 因为map是全局的,涉及到全局调用,因此加锁 defer mux.mu.Unlock() if pattern ==""panic("http:invalidpattern" + pattern) } nilnilhandler") mux.m[pattern].explicitmultipleregistrationsformux.m[pattern] muxEntry{explicit:true,192); background-color:inherit"> h: handler,192); background-color:inherit"> pattern: pattern}// 这里注册路由 err := http.ListenAndServe(nil)解读跟进函数ListenAndServe,内容如下 ListenAndServe(addrerrorserver := &Server{Addr: addr,192); background-color:inherit"> Handler: handler}server.ListenAndServe()而参数 Handler 是一个接口,内容如下看到 server := &Server{Addr: addr,192); background-color:inherit"> Handler: handler} 这句HandlerinterfaceServeHTTP(ResponseWriter,monospace; background-color:inherit">} 因为我们在调用ListenAndServe时,第二个参数是nil,所以这里的handle是nil 继续跟进ListenAndServe内容如下 (srvServer) ListenAndServe()addr srv.Addr addr":http" ln,192); background-color:inherit"> err net.Listen("tcp",192); background-color:inherit"> addr) // 在这里调用了tcp监听了 != err srv.Serve(tcpKeepAliveListener{ln.(*net.TCPListener)}) } 跟进 Serve,可以看到在该函数里面调用了rw,192)"> e := l.Accept(),在接受连接的函数并且每一个连接go c.serve() 创建了一个携程 跟进 c.serve() 可以看到在函数里面对请求调用了 ServeHTTP serverHandler{c.server}.ServeHTTP(w,192); background-color:inherit"> w.req) 跟进去内容如下 (shserverHandler)ServeHTTP(rw ResponseWriter,192); background-color:inherit"> req*Request{ handler:= sh.srv.Handler =={ // 在在这里判断用哪个 handler了 = DefaultServeMux } req.RequestURI "*"&&.Method "OPTIONS" globalOptionsHandler{} handler.ServeHTTP(rw) }很显然看出了,如果在调用err:=http.ListenAndServe(":8080",nil)时,第二个参数是 我们自定义的Handler的话则调用我们的,否则的话就默认调用 DefaultServeMux 由此可以看出,如果我们要自定义Handler的话只要实现ServeHTTP(ResponseWriter,192); background-color:inherit"> *Request)方法即可 例子如下: package main import ( "fmt" "log" "net/http" ) MyHandler (thisMyHandler) http.ResponseWriter,192); background-color:inherit"> *http.Request)fmt.Println("myHanlder") "myHanlder")) main()err http.ListenAndServe( &MyHandler{}) "ListenAndServe: err) }
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |