这个问题困扰了很久

hellsam · · 969 次点击
用struct封装一下 ```go type reqHandler struct { r *http.Request } func (c *reqHandler)test2(){ println(c.r.Host) } ```
#3
更多评论
我个人觉得,你如果用原生库可能就会遇到这种问题,但是你把原生的http库再封装一下,就像go.gin里用context,你不就在任何时候都可以通过context去获取url了么? func Test(ctx gin.Context){ ctx.url // 之类的 }
#1
我觉得这是正常的,因为go封装的比较底层,很多东西是需要自己去找思路写的。你这个问题应该就是一个挂载的问题,可以用中间件的思路,定义一个最先执行的中间件,对r做一些挂载。比如node中的express框架,针对每个请求定义一个全局变量,请求到来的时候就把该挂载的东西挂载上去,比如项目配置config,挂载之后再去匹配路由,这个时候你的r上已经挂载了config,就可以很方便的调用r.config了。 当然上面只是Node中的处理方式,但是跟go非常的相近,只是前者是事件驱动,多线程模拟异步。后者是为每个请求分配一个goroutine而已。go中也有一个模仿express的框架(echo),这些我都还没来得及了解,你可以研究一下的。 不知道是不是你想知道的问题哈哈,要自己做的话参考connect,简单原理就是封装一下,将路由加入一个队列中,请求到来了从队列中取路由函数出来执行。这样的话你就可以自定义一个路由函数放在队列头,做挂载,之后的路由就可以直接用r.config了,注意这里的路由是针对一次请。一次请求服务器也会做很多处理。 还有我这段时间看下来其实go仍然不是很适合web开发,速度慢,包少,对前端的支持还不够,当然因为我还才开始学。只是我觉得go目前看来更适合api以及其他一些对性能,严谨度比较高的地方。最好还是go替换java的基础设施,node做中间层处理一些其他队开发速度,更新速度要求高的地方,比如页面渲染等等
#2