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"))
结论
将多个键值对添加到上下文的最佳方法取决于应用程序的具体要求。对于性能至关重要且需要快速键值查找的情况,基于映射或混合的方法是最合适的。对于性能不太敏感的场景或键值对数量有限,多次调用 WithValue() 或使用结构体可能就足够了。
以上是如何有效地将多个键值对添加到 Go 上下文:单个调用与多个调用?的详细内容。更多信息请关注PHP中文网其他相关文章!