2024-06-21
golang
00

目录

golang上下文context的使用
常用的方法
实际使用

golang上下文context的使用

作用

通过使用Context,可以做到统一的、全链路的流程控制和数据传递。

常用的方法

golang
ctx=context.WithValue(ctx,"my_key","my_value") // 设置一个值 ctx,cancel:=context.WithCancel(context.Background()) //设置一个取消信号 ctx,cancel:=context.WithTimeout(context.Background(),1*time.Second) // 设置一个超时取消信号 cancel()

实际使用

  • 传递数据
golang
// 给context 设置一个值 // 会产生一个新的ctx,值存储在这个新的ctx上 ctx=context.WithValue(ctx,"my_key","my_value") // 从ctx中查找key,只有key的类型和值完全匹配,才会返回,否则返回nil val:=ctx.Value(my_key)
  • 取消信号的传递
func A() { // 创建一个可取消的context ctx,cancel:=context.WithCancel(context.Background()) defer cancel() var wg sync.WaitGroup wg.Add(1) var ok bool go func() { defer wg.Done() ok=B(ctx) if !ok{ cancel() // 取消其他调用 } }() wg.Add(1) var cv string go func() { defer wg.Done() cv=C(ctx) }() wg.Wait() fmt.Println("cv=",cv) } func B(ctx context.Context) bool { return false } func C(ctx context.Context) string { select { case <-ctx.Done(): return "fail" case <-time.After(1 * time.Minute): // 这里用 time.After 来模拟一个长耗时行为 // 若是其他调用的话,也需要将ctx继续传递 if ctx.Err()!=nil{ return "fail" } return "ok" } }
  • 超时取消信号的传递
golang
// 或者用 WithDeadline 也可以达到相同的效果,区别是参数不一样 ctx,cancel:=context.WithTimeout(context.Background(),1*time.Second) defer cancel() // 伪代码,下游B 和 下游C 会同时执行 go B(ctx) go C(ctx)

本文作者:曹子昂

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!