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