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

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

发布时间:2021-06-04 03:11:29 所属栏目:编程 来源:互联网
导读:什么是 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 的方法,其基本大同小异。看上去似乎不难,接下来我们看看其底层的基本原理和设计。

(编辑:核心网)

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

    热点阅读