如何使用context.WithValue()存储context.CancelFunc类型的值?
如何在context中存储
context.CancelFunc类型的值 和存储string类型值的逻辑一致,核心要求是使用自定义专属类型作为键,避免和其他包的存储键产生冲突,示例如下:
package main import ( "context" "fmt" "time" ) // 自定义非导出的键类型,保证包外无法创建同类型键,避免冲突 type cancelFuncKey int // 定义全局唯一的CancelFunc存储键,值为自定义类型的零值 const cancelKey cancelFuncKey = 0 func main() { // 创建可取消的上下文,拿到CancelFunc ctx, cancel := context.WithCancel(context.Background()) defer cancel() // 将CancelFunc存入context ctx = context.WithValue(ctx, cancelKey, cancel) // 模拟在其他逻辑中取出CancelFunc使用 triggerCancel(ctx) // 验证上下文是否被取消 select { case <-ctx.Done(): fmt.Println("上下文已被取消,原因:", ctx.Err()) case <-time.After(time.Second): fmt.Println("上下文未被取消") } } func triggerCancel(ctx context.Context) { // 取出CancelFunc,先做类型断言 if cancel, ok := ctx.Value(cancelKey).(context.CancelFunc); ok { fmt.Println("取出CancelFunc,执行取消操作") cancel() return } fmt.Println("未找到对应的CancelFunc") }
注意事项
- 该方案仅作技术实现演示,通常不建议将CancelFunc存入context传递:context的设计目标是传递请求生命周期的元数据,CancelFunc的所有权应该归启动上下文的父goroutine所有,随意传递会导致取消逻辑不可控,容易出现非预期的上下文终止。
- 自定义键类型建议定义为非导出类型,避免其他包使用同类型键产生冲突,保证存取的唯一性。
内容的提问来源于stack exchange,提问作者overexchange
相关产品推荐
相关产品推荐

