Skip to content
🎉 httpz v1.1.0 已发布

如何实现分组功能呢?在net/http中,它是这样实现的:

新建两个http.ServeMux,分别为v1和v2:

func main() {
	mux := http.NewServeMux()
 
	v1 := http.NewServeMux()
	v2 := http.NewServeMux()
 
	mux.Handle("/v1/", http.StripPrefix("/v1", v1))
	mux.Handle("/v2/", http.StripPrefix("/v2", v2))
}

mux.Handle把以/v1/开头的请求转发到v1, http.StriPrefix只是把请求的URL前缀/v1去掉。

但是这样的分组有些不方便,我们优化一下,使用之前的结构体ServeMux

type ServeMux struct {
  http.ServeMux
}

给它写一个分组的方法Group,它返回一个新的*ServeMux

func (m *ServeMux) Group(pattern string) *ServeMux {
	subMux := &ServeMux{
		ServeMux: http.ServeMux{},
	}
 
	// 去除后缀"/"
	stripPattern := strings.TrimSuffix(pattern, "/")
	m.ServeMux.Handle(pattern, http.StripPrefix(stripPattern, subMux))
 
	return subMux
}

这就是分组的主要逻辑。具体实现请参考: https://github.com/aeilang/httpz/blob/main/http.go