mindmap:Context

mindmap:Context

Context #

来历 #

Go在1.7的版本中才正式把Cntext加入到标准库中 #

在Go1.9中,还专门实现了一个叫做type alias的新特性 #

适用场景 #

上下文信息传递 #

控制子goroutine的运行 #

超时控制的方法调用 #

可以取消的方法调用 #

基本使用方法 #

四个实现方法 #

  • Deadline方法

    会返回这个Context被取消的截止日期

  • Done方法

    返回一个Channel对象

  • Err

    如果Done没有被close,Err方法返回nil; 如果Done被close,Err方法返回Done被close的原因

  • Value

    返回此ctx中和指定的key相关联的value

常用的生成顶层Context的方法 #

  • context.Background()

    返回一个非nil的、空的Context,没有任何值,不会被cancel,不会超时,没有截止日期。

  • context.TODO()

    返回一个非nil的、空的Context,没有任何值,不会被cancel,不会超时,没有截止日期。

使用规则 #

  • 一般函数使用Context时,会把这个参数放丰第一个参数的位置
  • 从来不把nil当作Context类型的参数值,可以使用context.Background()创建一个空的上下文对象
  • 只用作临时做函数之间的上下文透传,不能持久化Context或者Context长久保存
  • key的类型不应该使用字符串类型或者其它内奸类型,否则容易在包之间使用Context时候冲突
  • 常常使用struct{}作为底层类型定义key的类型

创建特殊用途Context的方法 #

WithValue #

基于parent Context生成一个新的Context,保存了一个key-value键值对,常常用来传递上下文。

WithCancel #

返回parent的副本,只是副本中的Done channel是新建的对象,它的类型是cancelCtx。

WithTimeout #

其实和WithDeadline一样,只不过一个参数是超时间,一个参数是截止时间。

WithDeadline #

返回一个parent的副本,并且设置了一个不易于参数d的截止时间,类型为 timerCtx(或者是cancelCtx)