Go Context包使用

本文详细介绍了Go的Context包,包括其在主动停止goroutine和传递数据方面的使用场景,解释了Context的含义及其在标准库中的地位。文章深入探讨了Context包的核心,如WithCancel、WithDeadline、WithTimeout和WithValue方法,并通过示例演示了它们的应用。遵循正确的Context使用规则对于保持接口一致性至关重要。
摘要由CSDN通过智能技术生成

前言

做为go的使用者,大家应该都多多少少的见过Context包。可是因为我得懒惰都没有跳转进去好好看看,导致我对Context包理解并不深。写博客是一个很好的方式提醒自己不要懒惰,而且还能当成自己的笔记,平时翻一翻加深下记忆。

Context使用场景

目前总结两种使用场景:
1. 主动停止groutine
2. 传递数据

Context是什么?

Context直译为上下文,我们来看一下Context包中对它的说明,在go1.7之后已经添加到了标准库中,我们之间可以在/src/context中查看。

Context包中对Context的说明

英文水平不是太好就直译了过来,最近有在学习英文,遇到了很多优秀的人,真的是比你优秀的人比你还努力。又扯远了…

  1. 包context定义了Context类型,并包含deadlines(结束时间),cancelation signals(取消信号),和其他的请求api范围的值。
  2. 对服务器的请求应该创建一个Context,服务器发出的外向请求应该接受Context。链式的函数调用之间必须传递Context,随意的更换它使用一个导出Context使用WithCancel、WithDeadline、WithTimeout、WithValue。当一个Context取消所有从它导出的Contexts都会被取消。
  3. WithCancel、WithDeadline、WithTimeout函数携带一个Context(父)并返回一个导出的Context(子)和一个CancelFunc(取消函数)。调用CancelFunc函数来取消子和他的孩子,移除父母的参考孩子,并停止任何关联的定时器。调用CancelFunc失败会泄露子和他的孩子直到父取消或者计时器超时。go的审查工具被用在所有的control-flow路径下检查CancelFuncs。

程序在使用Context应遵循如下规则,以保证接口的一致,并允许静态分析工具检查Context传递。
1. 不要将 Contexts 放入结构体,相反context应该作为第一个参数传入,命名为ctx。

func DoSomething(ctx context.Context, arg Arg) error {
         ... use ctx ...
}

2. 即使函数允许也不要传递一个nil的Context。如果不确定使用哪种Conetex,传递context.TODO
3. 使用context的Value相关方法只应该用于在程序和接口中传递的和请求相关的数据,不要用它来传递一些可选的参数。
4. 相同的Context

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值