当前位置: 首页 > news >正文

go资深之路笔记(一) Context

一、 Context 的正确使用与底层原理

1.结构体

type Context interface {// Deadline 返回此 Context 被取消的时间点。// 如果未设置截止时间,ok 为 false。Deadline() (deadline time.Time, ok bool)// Done 返回一个 channel。当 Context 被取消或超时后,此 channel 会被关闭。// 这是一个只读的 channel。关闭的 channel 仍然可以读取,会立即返回零值。// 通过 select 语句监听 Done channel 的关闭,是接收取消信号的关键。Done() <-chan struct{}// Err 返回 Context 为何被取消的错误。// 如果 Done channel 还未被关闭,返回 nil。// 如果已被关闭,返回非 nil 的错误解释原因:context.Canceled 或 context.DeadlineExceeded。Err() error// Value 允许 Context 携带请求域的数据。// 这些数据必须是安全的,以供多个 Goroutine 同时使用。// 应该用于传递非必要的、过渡性的数据,而非函数的可选参数。Value(key any) any
}

2.根与派生
创建根上下文

context.Background() 
context.TODO() 

派生(包装)现有上下文
WithCancel 是基础的可取消上下文包装,返回的cancel,调用后即可以立刻取消包装后的上下文,以及其派生上下文(不会影响到父上下文)
WithDeadline,WithTimeout是带截止时间/时间间隔的可取消上下文包装
WithValue 是包装消息,一般是一些贯穿全文的必要信息比如:用户id, token等

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)
func WithValue(parent Context, key, val any) Context

3.取消上下文原理:
以 func WithCancel(parent Context) (ctx Context, cancel CancelFunc) 为例:
3.1封装的 ctx有方法 Done() <-chan struct{},调用cancel后会给 Done() 的通道发送消息。监听这个通道的其他协程收到消息就可以返回(一般通过 select case default)。
3.2 构建关联(propagateCancel):
这个是解决当前上下文取消后,子上下文也被取消的关键:
派生的上下文如果是 cancelctx, 那么他会检查父上下文是不是也是,如果是的话,会将自己加入到 父context的 childmap,当父上下文被取消后,会遍历childmap来取消子上下文。
(ps: 父子上下文指的是包装前后,而不是函数传递。)
4. 实践总结:
4.1 谁创建谁取消:

ctx, cancel :=WithCancel(context.Background() )
defer cancel()	// 直接defer取消

4.2 Done chan 是只读的
4.3谨慎适用 WithValue,这个一般只传贯穿全文的必要信息比如:用户id, token等,具体的参数 通过函数参数传递
4.4 context对象是不可变的(不能从普通变成cancelctx),只能包装
4.5 context 的三大作用:取消信号,超时/截止时取消信号,WithValue存信息


文章转载自:

http://zCWZ9cWh.mqnbm.cn
http://kmSpysBa.mqnbm.cn
http://U1bZtOBu.mqnbm.cn
http://sS0ChMMG.mqnbm.cn
http://tkiVIb8W.mqnbm.cn
http://vvzRNHOI.mqnbm.cn
http://evGdKJCR.mqnbm.cn
http://j77v9qEm.mqnbm.cn
http://TS14D2Lm.mqnbm.cn
http://3gN7Udwy.mqnbm.cn
http://DHpy8gxq.mqnbm.cn
http://Z23g7e80.mqnbm.cn
http://TxojkMzX.mqnbm.cn
http://iDUjUrLj.mqnbm.cn
http://LiH6qWeN.mqnbm.cn
http://81AqGkJm.mqnbm.cn
http://j0y2OIoM.mqnbm.cn
http://ZI6cNQOk.mqnbm.cn
http://cR1cKg60.mqnbm.cn
http://zRWv7lRT.mqnbm.cn
http://xXVm2x92.mqnbm.cn
http://xcvnWhK1.mqnbm.cn
http://hSMq9E9B.mqnbm.cn
http://sa4VRndQ.mqnbm.cn
http://EG20CzEt.mqnbm.cn
http://YdMlSq14.mqnbm.cn
http://olxP9TU3.mqnbm.cn
http://8d5c0OpX.mqnbm.cn
http://pHOWgQJE.mqnbm.cn
http://nkg9umXa.mqnbm.cn
http://www.dtcms.com/a/376780.html

相关文章:

  • 数学建模资源合集
  • STM32项目分享:基于STM32智能吸尘器系统的设计与实现
  • 计算机毕设 java 高校会议室预约管理系统 基于 SSM 框架的高校会议室管理平台 Java+MySQL 的预约全流程管控系统
  • vue-pdf 实现blob数据的预览
  • RiskBird企业信息模糊查询工具
  • 常用PDF转换工具推荐
  • ES6 类与继承:现代 JavaScript 面向对象编程
  • 使用 Docker Buildx 制作并推送双架构镜像
  • PDF Reader 编辑阅读(Mac)
  • springboot响应式编程笔记
  • 论文阅读:ACL 2024 Stealthy Attack on Large Language Model based Recommendation
  • WebView电视v1.13.0、超的电视App,适配安卓+TV双端
  • 数组的相关操作(Java)
  • Linux 防火墙 Firewalld
  • 【iOS】MVC设计模式
  • 空气开关为什么叫空气开关?
  • win11 idea图标在任务栏中展示为空白
  • GaussDB 中 alter default privileges 的使用示例(下)
  • 自建注册中心
  • PMP考试结构、学习框架与基本术语
  • BrotliCompressor压缩器封装,以及 PDF编码器介绍
  • React 核心 Hook 与冷门技巧:useReducer、useEffect、useRef 及 is 属性全解析
  • 【大前端】 断点续传 + 分片上传(大文件上传优化) 的前端示例
  • 学习React-11-useDeferredValue
  • Django项目部署实战:Nginx + Gunicorn 云服务器完整指南
  • 【实战+原理】微软云 Azure Database 私有网络接入模式全解析:从子网委派到Private Endpoint
  • 排序---插入排序(Insertion Sort)
  • k8s的service
  • 量化冗余分析中变量的关系丨TomatoSCI分析日记
  • Python设计模式