07 February 2018

IMG-THUMBNAIL

通过黑科技扩展原生包的功能。

Golang HTTP 原始包

Golang 的框架用过不少,越来越发现还是原生的好。我们一般只做接口,对于项目服务没有那么高的灵活性要求,原生的 HTTP 包已经够用。而且原生包通过接口的形式提供了扩展的方式,自己简单扩展一下就方便很多。Golang 的设计思想就是简单,还是用简单的方式比较好。

路由

原生包的路由非常简单,就用了一个哈希表来报存路由。

type ServeMux struct {
	mu    sync.RWMutex
	m     map[string]muxEntry
	hosts bool // whether any patterns contain hostnames
}

每次请求进来都要在m里查询路由。但是这个路由有个问题,它是局部变量,而且没有对应的getter函数,我们没法知道路由的内容。

黑科技获取变量内部变量

获取内部变量m的方法也不难,通过反射的方式。路由变量ServeMux可以拿到,通过反射是可以拿到它的局部变量的。反射也提供了操作哈希表的对于方法。直接上代码:

v := reflect.ValueOf(mux)
m := v.Elem().FieldByName("m")

keys := m.MapKeys()

routers := make([]string, 0, len(keys))
for _, key := range keys {
	routers = append(routers, key.String())
}

sort.Strings(routers)

题图:天津瓷房子。

最近半年更新少了很多,太忙了,Go代码写得也少了很多,实在惭愧。又要到新年了,希望明年更好。

原文链接:Golang HTTP 服务路由查询,转载请注明来源!

EOF