如何全局访问处理程序值

时间:2019-06-10 09:14:41

标签: go

我有这个简单的http服务器。如何将请求数据访问全局变量并在应用程序的任何部分中使用它。

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 个答案:

答案 0 :(得分:-1)

您可以将net / context与http.Handler一起使用。例如,您的标头中包含“ X-Request-ID”,则可以这样定义中间件:

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)
}

您可以在任何带有Context对象的处理程序中获取requestIDKey。

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

这只是一个例子。在requestIDKey的插入下,您可以拥有应该放入Context并使用密钥从中读取的任何数据。 有关更多详细信息,请访问this博客。