大佬教程收集整理的这篇文章主要介绍了Golang学习笔记 - 标准库"net/http"的简析及自制简单路由框架,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
原文链接:http://targetliu.com/golang-http-router/
http.HandleFunc('/',func(w http.ResponseWriter,r *http.request){ fmt.Fprint(w,"Hello world") }) http.ListenAndServe(":8080",nil)
这样就成功的建立了一个监听 8080
端口的http服务器,当访问的时候输出 Hello world
我们顺藤摸瓜来看看 HandleFunc
做了些什么事:
func HandleFunc(pattern String,handler func(ResponseWriter,*request)) { DefaultServeMux.HandleFunc(pattern,handler) }
这里继续通过调用 DefaultServeMux
的 HandleFunc
方法注册路由,这个 DefaultServeMux
又是何方圣神:
type ServeMux struct { mu sync.RWMutex m map[String]muxEntry hosts bool // whether any patterns contain hostnames } type muxEntry struct { explicit bool h Handler pattern String } // NewServeMux allocates and returns a new ServeMux. func NewServeMux() *ServeMux { return new(ServeMuX) } // DefaultServeMux is the default ServeMux used by Serve. var DefaultServeMux = &defaultServeMux var defaultServeMux ServeMux
DefaultServeMux
是 net/http
包提供的一个默认的 ServeMux
类型,ServeMux
实现了 Handler
接口。
追根究底,发现http服务器收到一条请求后通过 go c.serve(ctX)
开启goroutIne
处理这个请求,在这个过程中调用了 Handler
接口函数 Servehttp
来做进一步的处理(比如匹配方法、链接等等)。
所以,我们就可以理解 ServeMux
就是 net/http
一个内置的路由功能。
继续回到 HandleFunc
来:
func (mux *ServeMuX) HandleFunc(pattern String,*request)) { mux.Handle(pattern,HandlerFunc(handler)) }
ServeMux
的 HandleFunc
方法将我们传入的路由具体实现函数转换成 HandlerFunc
类型并通过 Handle
注册到路由。这个 HandlerFunc
类型也实现了 Handler
接口:
type HandlerFunc func(ResponseWriter,*request) // Servehttp calls f(w,r). func (f HandlerFunC) Servehttp(w ResponseWriter,r *request) { f(w,r) }
最后到了 Handle
这个方法, Handle
方法通过将 pattern
路径以及实现了 Handler
接口的方法一一对应的保存到 ServeMux
的 @H_185_9@map[String]muxEntry 中,方便后续请求的时候调用。因此,也可以通过 Handle
直接传入一个实现了 Handler
接口的方法注册路由。
至此,net/http
包中默认路由的注册过程基本上已经走完。
至于请求的时候路由调用,记住通过 Servehttp
查找 @H_185_9@map 中对应路径并调用相关方法就行了。
通过以上的分析,我们可以依样画葫芦,实现自己的路由功能。
package route import ( "net/http" "Strings" ) //返回一个Router实例 func NewRouter() *Router { return new(Router) } //路由结构体,包含一个记录方法、路径的map type Router struct { Route map[String]map[String]http.HandlerFunc } //实现Handler接口,匹配方法以及路径 func (r *Router) Servehttp(w http.ResponseWriter,req *http.request) { if h,ok := r.Route[req.Method][req.URl.String()]; ok { h(w,req) } } //根据方法、路径将方法注册到路由 func (r *Router) HandleFunc(method,path String,f http.HandlerFunC) { method = Strings.ToUpper(method) if r.Route == nil { r.Route = make(map[String]map[String]http.HandlerFunC) } if r.Route[method] == nil { r.Route[method] = make(map[String]http.HandlerFunC) } r.Route[method][path] = f }
使用:
r := route.NewRouter() r.HandleFunc("GET","/",r *http.request) { fmt.Fprint(w,"Hello Get!") }) r.HandleFunc("POST","Hello POST!") }) http.ListenAndServe(":8080",r)
这个例子只是依样画葫芦的简单功能实现。
一个完整的路由框架应该包含更复杂的匹配、错误检测等等功能,大家可以试着自己动手试试。
阅读源码和重复造轮子都是学习的方法。
最后,欢迎大家关注我的博客http://targetliu.com/
以上是大佬教程为你收集整理的Golang学习笔记 - 标准库"net/http"的简析及自制简单路由框架全部内容,希望文章能够帮你解决Golang学习笔记 - 标准库"net/http"的简析及自制简单路由框架所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。