~~~
获取一个URL信息 那么很简单的一句话 就是 r.Host得到
func Test1(w http.ResponseWriter, r *http.Request)
{
fmt.Println(r.Host)
}
func Test2()string
{
//我有许多自定义函数,默认只传参数的那种, 由于需要功能需要, 需要传入个URL了 那么就需要r.Host了
//那么问题来了
//我为了得到这个r.Host实时得到这个URL,难道我几十个函数都要修改在参数多写一句 r *http.Request 吗?
//这样GO也太坑了吧 ,
//比如这样直接读取host不可以 纳闷 有什么解决办法吗 比如下面的 提供我几十个函数调用
return http.request.host // 这个肯定是错误的
//在C#中我用一句即可得到HOST HttpContext.Current.Request.Url.Host
//但是到了GO 貌似看来一个简单的函数 只要用到request里的东西 就必须参数加这个了 好坑有解决方案?
}
~~~
我觉得这是正常的,因为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
更多评论
我个人觉得,你如果用原生库可能就会遇到这种问题,但是你把原生的http库再封装一下,就像go.gin里用context,你不就在任何时候都可以通过context去获取url了么?
func Test(ctx gin.Context){
ctx.url // 之类的
}
#1
用struct封装一下
```go
type reqHandler struct {
r *http.Request
}
func (c *reqHandler)test2(){
println(c.r.Host)
}
```
#3