加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 湛江站长网 (https://www.0759zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

一文掌握 Go 语言解 密之上下文 Context

发布时间:2022-12-03 12:54:23 所属栏目:编程 来源:
导读:  Go 语言的独有的功能之一 Context,最常听说开发者说的一句话就是 “函数的第一个形参真的要传 ctx 吗?”,第二句话可能是 “有没有什么办法不传,就能达到传入的效果?”,听起来非常魔幻

  Go 语言的独有的功能之一 Context,最常听说开发者说的一句话就是 “函数的第一个形参真的要传 ctx 吗?”,第二句话可能是 “有没有什么办法不传,就能达到传入的效果?”,听起来非常魔幻。
 
  在 Go 语言中 context 作为一个 “一等公民” 的标准库,许多的开源库都一定会对他进行支持,因为标准库 context 的定位是上下文控制。会在跨 goroutine 中进行传播:
 
  本质上 Go 语言是基于 context 来实现和搭建了各类 goroutine 控制的,并且与 select-case联合,就可以实现进行上下文的截止时间、信号控制、信息传递等跨 goroutine 的操作,是 Go 语言协程的重中之重。
 
  context 基本特性
 
  演示代码:
 
  func main() {
 
   parentCtx := context.Background()
 
   ctx, cancel := context.WithTimeout(parentCtx, 1*time.Millisecond)
 
   defer cancel()
 
  
 
   select {
 
   case <-time.After(1 * time.Second):
 
    fmt.Println("overslept")
 
   case <-ctx.Done():
 
    fmt.Println(ctx.Err())
 
   }
 
  }
 
  输出结果:
 
  context deadline exceeded
 
  我们通过调用标准库 context.WithTimeout 方法针对 parentCtx 变量设置了超时时间,并在随后调用 select-case 进行 context.Done 方法的监听,最后由于达到截止时间。因此逻辑上 select 走到了 context.Err 的 case 分支,最终输出 context deadline exceeded。
 
  除了上述所描述的方法外,标准库 context 还支持下述方法:
 
  func WithCancel(parent Context) (ctx Context, cancel CancelFunc)
 
  func WithDeadline(parent Context, d time.Time) (Context, CancelFunc)
 
  func WithTimeout(parent Context, timeout time.Duration) (Context, CancelFunc)
 
  type Context
 
      func Background() Context
 
      func TODO() Context
 
      func WithValue(parent Context, key, val interface{}) Context
 
  WithCancel:基于父级 context,创建一个可以取消的新 context。
 
  WithDeadline:基于父级 context,创建一个具有截止时间(Deadline)的新 context。
 
  WithTimeout:基于父级 context,创建一个具有超时时间(Timeout)的新 context。
 
  Background:创建一个空的 context,一般常用于作为根的父级 context。
 
  TODO:创建一个空的 context,一般用于未确定时的声明使用。
 
  WithValue:基于某个 context 创建并存储对应的上下文信息。
 
  context 本质
 
  我们在基本特性中介绍了不少 context 的方法,其基本大同小异。看上去似乎不难,接下来我们看看其底层的基本原理和设计。
 

(编辑:PHP编程网 - 湛江站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!