我听说应该将上下文值密钥保密,如下所示:
type contextKey int
const (
requestIDKey contextKey = iota
otherKey
)
然而今天我遇到了golang如何定义
ServerContextKey
:
type contextKey struct {
name string
}
var (
ServerContextKey = &contextKey{"http-server"}
LocalAddrContextKey = &contextKey{"local-addr"}
)
这是否意味着我们可以导出上下文值键并让其他包使用
context
从context.WithValue(ctx, ServerContextKey, localvar)
对象中检索值?
谢谢。
是的,您当然可以从包中导出上下文键。要确保的关键是您使用自己定义的类型来避免与可能具有相同值的其他包中的键发生冲突。上下文键本质上是一个接口,因此即使两个不同的键具有相同的值,由于它们的类型不同,这些键仍然会指向不同的值。
例如:
package main
import (
"context"
"fmt"
)
type contextKeyA int
type contextKeyB int
func main() {
keyA := contextKeyA(1)
keyB := contextKeyB(1)
ctx := context.WithValue(context.Background(), keyA, "valueA")
ctx = context.WithValue(ctx, keyB, "valueB")
fmt.Println(ctx.Value(keyA)) // prints: valueA
fmt.Println(ctx.Value(keyB)) // prints: valueB
}
在此示例中,即使
keyA
和 keyB
具有相同的基础值 (1),它们也被视为不同的键,因为它们属于不同的类型(contextKeyA
和 contextKeyB
)。因此,它们在上下文中指向不同的值。