使用私有空变量作为全局唯一key

今天看代码的时候,遇到一段:

1
2
3
4
5
6
7
8
9
10
11
type keyType struct{}

var ctxKey = keyType{}

func FromContext(ctx context.Context) (OrgUser, error) {
if orgUser, ok := ctx.Value(ctxKey).(OrgUser); !ok {
return orgUser, errors.New("OrgUser not found")
} else {
return orgUser, nil
}
}

细一思索发现这种实现很巧妙,虽然 ctxKey 实际上只是一个空 struct ,但是 golang 中对于值的比对分为两部分,一部分是 type ,一部分是 value ,两者完全相同,才会视为相等。
上述代码中,keyType 为私有类型,外部正常途径无法获得这种类型,也就避免了会有 ctx 的 key 与 ctxKey 相同,此外空 struct 也不占用额外内存。


使用私有空变量作为全局唯一key
https://fatwang1.github.io/2024/12/26/2024122601/
作者
衣云乘风
发布于
2024年12月26日
许可协议