加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

一文掌握 Go 语言解密之上下文 Context

发布时间:2021-06-06 02:00:37 所属栏目:编程 来源:互联网
导读:什么是 context Go 说话的独占的成果之一 Context,最常传闻开拓者说的一句话就是 函数的第一个形参真的要传 ctx 吗?,第二句话也许是 有没有什么步伐不传,就能

Go 说话的独占的成果之一 Context,最常传闻开拓者说的一句话就是 “函数的第一个形参真的要传 ctx 吗?”,第二句话也许是 “有没有什么步伐不传,就能到达传入的结果?”,听起来很是魔幻。

在 Go 说话中 context 作为一个 “一等国民” 的尺度库,很多的开源库都必然会对他举办支持,由于尺度库 context 的定位是上下文节制。会在跨 goroutine 中举办撒播:

本质上 Go 说话是基于 context 来实现和搭建了种种 goroutine 节制的,而且与 select-case连系,就可以实现举办上下文的截至时刻、信号节制、信息转达等跨 goroutine 的操纵,是 Go 说话协程的重中之重。

context 根基特征

演示代码:

func main() { 

 parentCtx := context.Background() 

 ctx, cancel := context.WithTimeout(parentCtx, 1*time.Millisecond) 

 defer cancel() 

 

 select { 

 case <-time.After(1 * time.Second): 

  fmt.Println("overslept") 

 case <-ctx.Done(): 

  fmt.Println(ctx.Err()) 

 } 

输出功效:

context deadline exceeded 

我们通过挪用尺度库 context.WithTimeout 要领针对 parentCtx 变量配置了超时时刻,并在随后挪用 select-case 举办 context.Done 要领的监听,最后因为到达截至时刻。因此逻辑上 select 走到了 context.Err 的 case 分支,最终输出 context deadline exceeded。

除了上述所描写的要领外,尺度库 context 还支持下述要领:

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) 

type Context 

    func Background() Context 

    func TODO() Context 

    func WithValue(parent Context, key, val interface{}) Context 

WithCancel:基于父级 context,建设一个可以打消的新 context。

WithDeadline:基于父级 context,建设一个具有截至时刻(Deadline)的新 context。

WithTimeout:基于父级 context,建设一个具有超时时刻(Timeout)的新 context。

Background:建设一个空的 context,一样平常常用于作为根的父级 context。

TODO:建设一个空的 context,一样平常用于未确按时的声明行使。

WithValue:基于某个 context 建设并存储对应的上下文信息。

context 本质

我们在根基特征中先容了不少 context 的要领,其根基大同小异。看上去好像不难,接下来我们看看其底层的根基道理和计划。

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读