畅远数码|万字手撕Go http源码server.go( 四 )
mux.redirectToPathSlash()
mux.redirectToPathSlash()函数确定是否需要在其路径后附加"/" , 一旦判断需要添加"/"则返回新的url和被重定向后的handler:
func (mux *ServeMux) redirectToPathSlash(host, path string, u *url.URL) (*url.URL, bool) {mux.mu.RLock()shouldRedirect := mux.shouldRedirectRLocked(host, path)mux.mu.RUnlock()if !shouldRedirect {return u, false}path = path + "/"u =ok {return RedirectHandler(u.String(), StatusMovedPermanently), u.Path}return mux.handler(r.Host, r.URL.Path)复制代码mux.handler()
mux.handler()函数是mux.Handler()的一种实现
// handler is the main implementation of Handler.// The path is known to be in canonical form, except for CONNECT methods.func (mux *ServeMux) handler(host, path string) (h Handler, pattern string) {mux.mu.RLock()defer mux.mu.RUnlock()// Host-specific pattern takes precedence over generic onesif mux.hosts {h, pattern = mux.match(host + path)}if h == nil {h, pattern = mux.match(path)}if h == nil {h, pattern = NotFoundHandler(), ""}return}复制代码进行两种匹配后都没有找到相应的handler后 , 返回NotFoundHandler()
总结Go 其实支持外部实现的路由器 ListenAndServe 的第二个参数就是用以配置外部路由器的 , 它是一个 Handler 接口 , 即外部路由器只要实现了 Handler 接口就可以 , 我们可以在自己实现的路由器的 ServeHTTP 里面实现自定义路由功能
HandleFunc()HandleFunc()是函数
HandleFunc定义对于给定的模式字符串 , HandleFunc将handler函数注册到相应的路由上 。 换句话说 , 当对不同的url路径请求时 , 给出不同的处理逻辑 , 而HandleFunc可以实现这种将处理逻辑和url绑定的关系 。
函数定义:
func HandleFunc(pattern string, handler func(ResponseWriter, *Request)) {DefaultServeMux.HandleFunc(pattern, handler)}复制代码第一个参数是字符串 , 第二个参数是handler , HandleFunc处理匹配到的url路径请求 。
HandleFunc()本质上调用了默认复用器的mux.HandleFunc()
例子:
package mainimport ("io""log""net/http")func main() {h1 := func(w http.ResponseWriter, _ *http.Request) {io.WriteString(w, "Hello from a HandleFunc #1!\n")}h2 := func(w http.ResponseWriter, _ *http.Request) {io.WriteString(w, "Hello from a HandleFunc #2!\n")}http.HandleFunc("/", h1)http.HandleFunc("/endpoint", h2)log.Fatal(http.ListenAndServe(":8080", nil))}复制代码HandleFunc优势HandleFunc函数的存在使得我们可以直接将一个func(ResponseWriter, *Request)类型的函数作为handler , 而不再需要实现Handler这个接口和自定义一个实现ServeHTTP函数的类型了 , HandleFunc可以非常简便的为url注册路径 。
Handle()Handle()是函数
Handle()定义和HandleFunc类似 , 本质上也是调用了默认mux的mux.Handle()方法
函数定义:
// Handle registers the handler for the given pattern// in the DefaultServeMux.// The documentation for ServeMux explains how patterns are matched.func Handle(pattern string, handler Handler) { DefaultServeMux.Handle(pattern, handler) }复制代码第一个参数是待匹配的字符串 , 第二个参数是Handler类型的handler , 和上面例子的handler不同 , 需要自己实现一个新的类 , 并且实现类中的方法ServeHTTP
例子:
推荐阅读
- 英雄科技聊数码|蔡崇信有实力买下篮网,那身价3200亿的马云,能买下几支NBA球队
- 搜狐新闻|准大学生数码三件套如何选?这些元气好物值得种草
- 数码鲜蜂|三星大秀肌肉!这个透明手机如何?
- 数码科技大爆炸|台积电断供华为芯片开启倒计时!已不足10天:华为多位高管表态
- 海外网|菅义伟计划对厚生劳动省进行改革 创设"数码厅"
- 数码实验室|《飞速骑行4》2021年推出PS5和XboxSeriesX版
- 老实人数码|取代苹果XR系列,不支持5G网络,iPhone12s真机疑似被曝光
- 畅远数码|马云曾提出的4大预言,已经实现3个,网友:最后一个才是关键
- 神说要唱歌|数码宝贝大冒号14话解读 虫王对决 偷学战斗龙卷风的超比多兽
- 畅远数码|欧洲大量5G基站被烧毁!原因让人啼笑皆非
