go进阶语法
2022-11-13 11:41:20 0 举报
AI智能生成
go进阶语法相关知识,持续更新...
作者其他创作
大纲/内容
并发编程
context包
注意事项:
一般只用于方法参数,且作为第一个参数
除util、helper之类的方法外,都应该考虑加上context参数
除结构体表达一个上下文的概念外(如web框架的context),最好不要放在结构体字段
面试要点:
使用场景 - 上下文传递和超市控制
原理 - 父级如何控制子级:子级主动加入父级children字段,需要操作时父级遍历children即可
原理 - valueCtx(k-v)和timeCtx(cancel+计时器)原理
注意事项:
一般只用于方法参数,且作为第一个参数
除util、helper之类的方法外,都应该考虑加上context参数
除结构体表达一个上下文的概念外(如web框架的context),最好不要放在结构体字段
面试要点:
使用场景 - 上下文传递和超市控制
原理 - 父级如何控制子级:子级主动加入父级children字段,需要操作时父级遍历children即可
原理 - valueCtx(k-v)和timeCtx(cancel+计时器)原理
安全传递数据
WithWalue:设置键值对,并且返回一个新的context实例
例子:
例子:
- 链路追踪的trace id
- AB测试的标记位
- 压力测试的标记位
- 分库分表中间件传递sharding hint
- ORM中间件传递SQL hint
- Web框架传递上下文
用于控制链路:返回一个可以取消的context实例和取消函数 子Context无法重置时间
WithCancel:无确定过期时间,在需要的地方随时取消。为典型的装饰器模式,在Context的基础上加上取消的功能
cancelCtx实现
children:核心是子Ctx把自己添加进父Ctx的children字段里。本质上是找最近属于cancelCtx类型的祖先,然后子Ctx把自己添加进去
cancel:遍历调用children的cancel,即关闭done的channel,符合谁创建谁关闭的原则
cancelCtx实现
children:核心是子Ctx把自己添加进父Ctx的children字段里。本质上是找最近属于cancelCtx类型的祖先,然后子Ctx把自己添加进去
cancel:遍历调用children的cancel,即关闭done的channel,符合谁创建谁关闭的原则
WithDealine:在固定时刻过期
WithTimeout:在一段时间后过期。源码调用WithDealline,传入time.Now().Add(超时时间)
核心API
Deadline:返回过期时间,如果ok为false,说明没有设置过期时间
Done:返回一个channel,一般用于监听Context实例的信号,比如过期或者正常关闭
Err:返回Context发生的错误,Canceled=>正常关闭,DeadlineExceeded=>过期超时
Value:取值
valueCtx:用于存储key-value数据
典型的装饰器模式:在已有Context的基础上附加一个存储key-value的功能
只能存储一个key,val:
- 为什么不用map?因为map要求key是comparable(可比较)的,而我们可能用不是comparable的key
- context的设计理念就是将Context设计成不可变的
配合超时控制
select + time.After
time.AfterFunc
配合errgroup
sync包
channel编程
0 条评论
下一页
为你推荐
查看更多