前言
golang自带路由库 http.ServerMux实现了一些简单的路由功能,但是还十分不足,因此可以借助gorilla/mux中的功能弥补,那么他们两种实现有什么区别呢?
DefaultServeMux
在DefaultServeMux中,可以找到关于路由表的实现部分:
type ServeMux struct {
mu sync.RWMutex
m map[string]muxEntry
}
type muxEntry struct {
explicit bool
h Handler
pattern string
}
其中muxEntry储存了路由表的基本信息,如是否冲突,处理函数等。
路由注册的过程就是向路由表中插入相应值的过程,返回最长匹配路径的路由的相关信息,如果找不到则返回NotFoundHandler。
func (mux *ServeMux) handler(host, path string) (h Handler, pattern string) {
mux.mu.RLock()
defer mux.mu.RUnlock()
if h == nil {
h, pattern = mux.match(path)
}
if h == nil {
h, pattern = NotFoundHandler(), ""
}
return
}
func (mux *ServeMux) match(path string) (h Handler, pattern string) {
var n = 0
for k, v := range mux.m {
if !pathMatch(k, path) {
continue
}
if h == nil || len(k) > n {
n = len(k)
h = v.h
pattern = v.pattern
}
}
return
}
func pathMatch(pattern, path string) bool {
n := len(pattern)
if pattern[n-1] != '/' {
return pattern == path
}
return len(path) >= n && path[0:n] == pattern
}
但是DefaultServeMux也存在很大缺陷,如不支持参数设定,例如/user/:uid 这种泛型类型匹配,也不支持正则;无法很友好的支持REST模式,无法限制访问方法(POST,GET等)。
gorilla/mux
在本次项目中,第一次调用mux是