douya7121 2019-06-10 09:14
浏览 15
已采纳

如何全局访问处理程序值

I have this simple http server. How can i access the request data to a global variable and use it in any part of the application.

package main

import (
    "io"
    "net/http"
)

var data string // Get URL data globally and use it in other part of the  application

func hello(w http.ResponseWriter, r *http.Request) {
    data := r.URL.Query().Get("somestring")
}

func main() {
    mux := http.NewServeMux()
    mux.HandleFunc("/", hello)

    http.ListenAndServe(":8000", mux)
}
  • 写回答

1条回答 默认 最新

  • 普通网友 2019-06-10 09:54
    关注

    You could use net/context with http.Handler. for example you have "X-Request-ID" in header, you could define middlware like this:

    func middleware(next http.Handler) http.Handler {
        return http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) {
            ctx := newContextWithRequestID(req.Context(), req)
            next.ServeHTTP(rw, req.WithContext(ctx))
        })
    }
    type key int
    const requestIDKey key = 0
    
    func newContextWithRequestID(ctx context.Context, req *http.Request) context.Context {
        reqID := req.Header.Get("X-Request-ID")
        if reqID == "" {
            reqID = generateRandomID()
        }
    
        return context.WithValue(ctx, requestIDKey, reqID)
    }
    
    func requestIDFromContext(ctx context.Context) string {
        return ctx.Value(requestIDKey).(string)
    }
    

    you could get requestIDKey in any handler with Context object.

    func handler(rw http.ResponseWriter, req *http.Request) {
        reqID := requestIDFromContext(req.Context())
        fmt.Fprintf(rw, "Hello request ID %v
    ", reqID)
    }
    

    this is just an example. insted of requestIDKey you could have any data which you should put in Context and read from it with a key. for more detail information visit this blog.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示
  • ¥15 求三国群英传pl国战时间的修改方法
  • ¥15 matlab代码代写,需写出详细代码,代价私
  • ¥15 ROS系统搭建请教(跨境电商用途)
  • ¥15 AIC3204的示例代码有吗,想用AIC3204测量血氧,找不到相关的代码。