一文掌握 Go 语言解密之上下文 Context
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 的要领,其根基大同小异。看上去好像不难,接下来我们看看其底层的根基道理和计划。 (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |