Context.WithValue 中的键值对添加:单个添加与多个添加
在 Go 的 context 包中,context.WithValue 允许将特定于请求的数据添加到请求处理堆栈中。然而,在处理多个键值对时,最佳方法并不是立即显而易见的。
多次调用 WithValue()
一个选项是调用 WithValue( ) 多次,逐步将每个键值对添加到上下文中。虽然此方法很简单,但对于大量对来说可能会变得很麻烦。
结构体的使用
另一种方法是使用一个封装所有结构体的结构体键值对,将 WithValue() 调用减少为 1。但是,这种方法可能会导致不必要的数据复制。
基于映射的解决方案
要增强快速键值查找的性能,请考虑使用映射并添加它作为上下文的单个值。这允许以 O(1) 的方式有效访问各个值。
混合方法
混合解决方案结合了两种方法的优点。创建一个包装器结构,隐藏未导出的映射并提供 getter 方法。通过仅将包装器结构添加到上下文,可以保留并发访问,最大限度地减少数据复制,并保持快速键值查找。
示例:混合解决方案
type Values struct { m map[string]string } func (v Values) Get(key string) string { return v.m[key] }
v := Values{map[string]string{ "1": "one", "2": "two", }} c := context.Background() c2 := context.WithValue(c, "myvalues", v) fmt.Println(c2.Value("myvalues").(Values).Get("2"))
结论
添加多个key的最优方法- 上下文的值对取决于应用程序的具体要求。对于性能至关重要且需要快速键值查找的情况,基于映射或混合的方法是最合适的。对于性能不太敏感的场景或键值对数量有限,多次调用 WithValue() 或使用结构可能就足够了。
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3