在上一篇文章中,我分享了有关context包的第一部分:valueCtx和cancelCtx,我们在这篇文章中继续探索更多内容。WithTimeout 和 WithDeadline我们还是先来一个例子:package main import ( "context" "fmt" "time" ) func main() { cancelCtx, cancel := context.WithTimeout(context.Background(), time.Second*3) defer cancel() go task(cancelCtx) time.Sleep(time.Second * 4) } func task(ctx context.Context) { i := 1 for { select { case <-ctx.Done(): fmt.Println(ctx.Err())
背景context在整个Golang生态体系中被广泛使用,我们在平时开发的时候也会经常用到它,而且Golang的很多标准包都依赖它context。关于context的一些使用方法的应用场景我在前面两篇文章也做了详细介绍,今天这篇文章我们就来介绍context内部的源码。我们先回顾一下context它能解决的一些问题:公共参数或数据的传递通知所有子goroutine优雅退出,从而释放资源业务执行超时或者在截止日期之前执行结束,然后程序优雅地退出或返回上面几种使用方法就不做详细的介绍,下面直接看context包的源码。源码分析我们打开context包里面的context.go文件,发现其实除开注释的一些文档外,差不多也就只有200多行的代码。Context接口和emptyCtxcontext最基本的数据结构是Context如下接口:type Context interface { Deadline() (deadline time.Time, ok bool) Done() <-chan struct{} Err() error Value(key i
青丝南开
文字、摄影、骑行爱好者