前言
如何使用Golang中的context进行传递值和取值?
一、context简介
context包在Go语言的1.7版本被引入为标准库的一部分,其最初的设计是源自Google。该包提供了一种机制,能够在API边界和进程间传递截止日期(deadline)、取消信号、以及其他请求生命周期内的数据。
在进行网络请求或运行其他需要在特定时间内完成的操作时,context能够设置截止时间或超时,当超过指定时间后,相关的操作会被自动取消。此外,context也提供了手动取消操作的能力。
context内部维护了一个并发安全的键值对映射(map),用于在请求的生命周期内存储和传递数据。这样,无需将数据显式地作为参数在函数或goroutine之间传递,而是可以通过context在全局范围内访问这些数据。
因此,context可以被视为一种全局的、跨API和进程边界的数据和信号传递机制,极大地提高了Go语言在处理分布式系统、并发控制和资源管理方面的能力。
二、context传递值和取值
1.传递值
context.WithValue函数是Go语言中context包的一个函数,它用于将键值对附加到指定的context中。这个函数的原型如下:
func WithValue(parent Context, key, val interface{}) Context
2.取值
然后你可以用Value方法从Context中获取这个值:
v := ctx.Value("k1")
fmt.Println(v) // 输出 "v1"
2.代码示例
package main
import (
"context"
"fmt"
)
func SetValue(ctx context.Context) context.Context {
return context.WithValue(ctx, "k1", "v1")
}
func GetValue(ctx context.Context) string {
return ctx.Value("k1").(string)
}
func main() {
ctx := context.Background()
ctx = SetValue(ctx)
value := GetValue(ctx)
fmt.Println("value:", value)
}
总结
context中使用context.WithValue函数传递值,使用Value方法从context中获取这个值。