”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 如何有效地将多个键值对添加到 Go 上下文:单个调用与多个调用?

如何有效地将多个键值对添加到 Go 上下文:单个调用与多个调用?

发布于2024-11-24
浏览:197

How to Add Multiple Key-Value Pairs to a Go Context Efficiently: Single vs. Multiple Calls?

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