Context的主要用于场景包括
1)信息传递 (request-scoped),如处理http请求在请求处理链路上传递信息
2)控制子 goroutine 的运行
3)超时控制的方法调用
4)可以取消的方法调用
现在存在的一些问题主要包括:
1)Context漫天飞,函数污染
2)Context.WithValue 可以接受任何类型的值,非类型安全
3)命名问题
主要提供如下方法:
1)Deadline:返回Context被取消的截止日期。如果没有设置,ok是false。后续每次调用这个方法时,都会返回相同的结果
2)Done:返回一个Channel对象, Context被取消时,此Channel会被close,如果没被取消,可能会返回 nil
3)Value:返回此 ctx 中和指定的 key 相关联的 value
如何创建:
1)context.Background()
2)context.TODO()
两种方法本质上是一样的,都会返回一个空的Context(非nil),没有任何值,不会被cancel,不会超时,没有截止日期
一些常用的特殊的包括:
1)WithValue:基于parent Context生成一个新的Context,保存了一个key-value键值对。常常用来传递上下文
2)WithCancel:方法返回parent的副本,只是副本中的Done Channel是新建的对象,它的类型是cancelCtx
3)WithTimeout:同Deadline方法,只是一个是决定时间,一个是相对时间
一些常用的使用context的规范:
1)函数使用Context的时候,会把他放在第一个参数
2)不把nil当做 Context 类型的参数值,可以使用 context.Background() 创建一个空的上下文对象,也不要使用 nil
3)Context 只用来临时做函数之间的上下文透传,不能持久化Context
4)key的类型不应该是字符串类型或者其它内建类型,否则容易在包之间使用 Context 时候产生冲突。使用WithValue时,key类型应该自定义
此文章为2月Day15学习笔记,内容来源于极客时间《Go 并发编程实战课》