Golang HTTP 服务路由查询

综合技术 2018-02-07 阅读原文

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
代码写得也少了很多,实在惭愧。又要到新年了,希望明年更好。

责编内容by:Cyeam 【阅读原文】。感谢您的支持!

您可能感兴趣的

Mini Rulebook for Go short declarations Short variable declarations rulebook How to use short variable declarations properly. :point_right: Y...
node.js and jsdom – no way to detect that an... I'm using jsdom with node.js and I'm trying to get it to provide me with some indication that an http error has occurred. I've set up a test ser...
Java HTTP 组件库选型看这篇就够了 Java HTTP 组件库选型看这篇就够了 最近项目需要使用 Java 重度调用 HTTP API 接口,于是想着封装一个团队公用的 HTTP client lib. 这个库需要支持以下特性: 连接池管理,包括连接创建和超时、空闲连接数控制、每个 host 的连接数配置等。基本上,...
Stack Overflow最新薪资计算器出炉:DevOps和Go语言开发者是大赢家... Stack Overflow 2018年最新的薪资计算器正式出炉。最新的计算器除了增加新的国家和地区之外,还更新了数字数据。为了让薪资更上一层楼,你应该关注哪些技术?这取决于你是愿意冒一些风险还是只想待在安全区域。 你知道自己的技术能力值多少钱吗?Stack Overflow最新的2018年薪...
golang技巧-接口型函数 接口型函数:指的是用函数实现接口,这样在调用的时候就会非常简便,这种函数为接口型函数,这种方式适用于只有一个函数的接口。 定义一个类型,这个类型只定义了函数的参数列表,函数参数列表与接口定义的方法一致: type HandlerFunc func(k, v interface{}) ...