context.Context

本文详细介绍了Golang中的context.Context接口,包括接口方法的含义和使用,如Deadline、Done、Err和Value。讲解了如何从根Context(background和TODO)衍生出子Context,并使用With系列函数(WithCancel、WithDeadline、WithTimeout和WithValue)。同时,提出了使用Context时的原则,如避免在结构体中存储Context,将其作为函数的第一个参数,以及如何恰当使用Value传递元数据。最后强调了Context在并发环境中的线程安全性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

golang控制并发(sync.WaitGroup和context.Context)中,我们有讲到context的作用及简单使用,现在扩展开来讲讲context还有哪些别的东西

Context 接口

Context 的接口定义的比较简洁,我们看下这个接口的方法。

type Context interface {
   
	Deadline() (deadline time.Time, ok bool)

	Done() <-chan struct{
   }

	Err() error

	Value(key interface{
   }) interface{
   }
}

这个接口共有 4 个方法,了解这些方法的意思非常重要,这样我们才可以更好的使用他们。

Deadline 方法是获取设置的截止时间的意思,第一个返回式是截止时间,到了这个时间点,Context 会自动发起取消请求;第二个返回值 ok==false 时表示没有设置截止时间,如果需要取消的话,需要调用取消函数进行取消。

Done 方法返回一个只读的 chan,类型为 struct{},我们在 goroutine 中,如果该方法返回的 chan 可以读取,则意味着 parent context 已经发起了取消请求,我们通过 Done 方法收到这个信号后,就应该做清理操作,然后退出 goroutine,释放资源。

Err 方法返回取消的错误原因,因为什么 Context 被取消。

Value 方法获取该 Context 上绑定的值,是一个键值对,所以要通过一个 Key 才可以获取对应的值,这个值一般是线程安全的。

以上四个方法中常用的就是 Done 了,如果 Context 取消的时候,我们就可以得到一个关闭的 chan,关闭的 chan 是可以读取的,所以只要可以读取的时候,就意味着收到 Context 取消的信号了,以下是这个方法的经典用法。

  func Stream(ctx context.Context, out chan<- Value) error {
   
  	for {
   
  		v, err := DoSomething(ctx)
  		if err != nil {
   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值