这个问题困扰了很久

hellsam · 2018-01-17 23:34:52 · 1160 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2018-01-17 23:34:52 的主题,其中的信息可能已经有所发展或是发生改变。

获取一个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大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1160 次点击  
加入收藏 微博
3 回复  |  直到 2018-01-22 16:23:03
oscarzhou
oscarzhou · #1 · 7年之前

我个人觉得,你如果用原生库可能就会遇到这种问题,但是你把原生的http库再封装一下,就像go.gin里用context,你不就在任何时候都可以通过context去获取url了么?

 func Test(ctx gin.Context){
    ctx.url // 之类的

 }
GopherJ
GopherJ · #2 · 7年之前

我觉得这是正常的,因为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做中间层处理一些其他队开发速度,更新速度要求高的地方,比如页面渲染等等

victorl
victorl · #3 · 7年之前

用struct封装一下

type reqHandler struct {
    r *http.Request
}

func (c *reqHandler)test2(){
    println(c.r.Host)
}
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传