Context是golang官方定义的一个package,它定义了Context类型,里面包含了Deadline/Done/Err方法以及绑定到Context上的成员变量值Value,具体定义如下: type Context interface {// 返回Context的超时时间(超时返回场景)Deadline() (deadline time.Time, ok bool)/
ctx := context.Background()//创建根contextcancelCtx, cancelFunc := context.WithCancel(ctx)//基于根创建第二层context对象,传入协程中gotask(cancelCtx) time.Sleep(time.Second *3) cancelFunc()// 可以在父级对创建的子context发起取消 context(即结束协程)time.Sleep(time.Second *1)// 延时等待协程退...
req*http.Request){// 从请求中提取请求ID和用户信息requestID:=req.Header.Get("X-Request-ID")// 创建子 context,并添加一个请求 Id 的信息ctx:=context.WithValue(req.Context(),requestIDKey,requestID)// 创建一个新的请求,设置新 ctxreq=req.WithContext...
cancel := context.WithDeadline(parent, time.Now().Add(5*time.Second))gofunc() {select {case <-ctx.Done():fmt.Println(ctx.Err())returncase <-time.After(10 * time.Second):fmt.Println("work done")}}()time.Sleep(20 *...
Context 出场 幸好,我们不用自己每次写代码都要去实现这个很基础的能力。Golang 为我们准备好了一切,就是context.Context这个包,这个包的源代码非常简单,源码部分本文会略过,下期单独一篇文章来讲,本篇我们重点谈正确的使用。 Context 的结构非常简单,它是一个接口。
go 语言写服务里面最多的参数之一就是 context,这里抽时间对于 context 进行一下总结。 Context 是什么? 按照官方定义在 go 语言里面 context 包定义了一个 context 类型的接口,携带了截止时间,取消信号,超时时间,以及携带上下文的系统参数(k-v)的类型。是 Go 语言 1.7 版本引入的。
Context本质 golang标准库里Context实际上是一个接口(即一种编程规范、 一种约定)。 typeContextinterface{Deadline()(deadlinetime.Time,okbool)Done()<-chanstruct{}Err()errorValue(keyany)any} 通过查看源码里的注释,我们得到如下约定: Done()函数返回一个只读管道,且管道里不存放任何元素(struct{}),所以用...
typeContextinterface{Deadline()(deadline time.Time,okbool)Done()<-chanstruct{}Err()errorValue(keyinterface{})interface{}} 接口方法:简单解读 Deadline() 这个方法会返回两个值: deadline:类型为time.Time,表示Context会被取消的时间点。 ok:类型为bool,如果为true,则表示设置了截止日期。
以此类推,Golang 里的 Context 功能和含义也类似: Context 本身就是那个包含了数据、信息的上下文,开发者可以通过它,关联起不同的 goroutine,使这些 goroutine 共享同一个由用户设定的上下文,从而达到统一控制这些 goroutine 的目的。 记住这个概念,它是 Context 的核心,也是贯穿整篇文章的核心。
type Context interface { // 标识deadline是否已经设置了,没有设置时,ok的值是false,并返回初始的time.Time Deadline() (deadline time.Time, ok bool) // 返回一个channel, 当返回关闭的channel时可以执行一些操作 Done() <-chan struct{} // 描述context关闭的原因,通常在Done()收到关闭通知之后才能知道...