从Golang

时间:2016-06-16 18:19:41

标签: http go header httprequest

我正在使用Golang net / context包将上下文对象中包含的ID从一个服务传递到另一个服务。我能够成功传递上下文对象但是为了实际检索特定键的值,context.Value(key)总是返回nil。我不知道为什么,但这是我到目前为止所做的:

if ctx != nil {
        fmt.Println(ctx)
        fmt.Println("Found UUID, forwarding it")

        id, ok := ctx.Value(0).(string)  // This always returns a nil and thus ok is set to false
        if ok {
            fmt.Println("id found %s", id)
            req.headers.Set("ID", id)
        }
    }  

ctx属于context.Context类型,打印时我得到:

context.Background.WithValue(0, "12345")

我有兴趣从上下文中获取值“12345”。从Golang网络/上下文文档(https://blog.golang.org/context)开始,Value()接受interface {}类型的键并返回一个接口{},因此我将类型转换为。(string)。任何人都可以帮忙吗?

1 个答案:

答案 0 :(得分:4)

您的上下文密钥不是int,这是在0中传递给Value时非分类常量interface{}将被分配的默认类型。

c := context.Background()

v := context.WithValue(c, int32(0), 1234)
fmt.Println(v.Value(int64(0)))  // prints <nil>
fmt.Println(v.Value(int32(0)))  // print 1234

您还需要使用正确的类型设置和提取值。您需要定义一个始终用作键的单一类型。我经常定义辅助函数来提取上下文值并执行类型断言,在您的情况下,它也可用于规范化键类型。