如何在Golang中使用上下文方法

  介绍

本篇文章为大家展示了如何在Golang中使用上下文方法,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

上下文在Golang的1.7版本之前,是在包golang.org/x/net/context中的,但是后来发现其在很多地方都是需要用到的,所有在1.7开始被列入了Golang的标准库.Context包专门用来简化处理单个请求的多个goroutine之间与请求域的数据,取消信号,截止时间等相关操作,那么这篇文章就来看看其用法和实现原理。

<强>源码分析

首先我们来看一下上下文里面核心的几个数据结构:

<强>上下文接口

type  Context  interface  {   最后期限才能(),(deadline  time.Time, ok  bool)   完成(),才能& lt; -chan 结构{}   犯错才能(),错误   价值才能({})key 接口,接口{}   }

期限返回一个时间。时间,是当前上下文的应该结束的时间,好表示是否有最后期限。

做方法在上下文被取消或超时时返回一个关闭的通道,关闭的通道可以作为广播通知,告诉给上下文相关的函数要停止当前工作然后返回。

犯错方法返回上下文为什么被取消。

价值可以让Goroutine共享一些数据,当然获得数据是协程安全的。但使用这些数据的时候要注意同步,比如返回了一个地图,而这个地图的读写则要加锁。

<强>消除器界面

消除器接口定义了提供取消函数的上下文:

type  canceler  interface  {   取消才能(removeFromParent  bool, err 错误)   完成(),才能& lt; -chan 结构{}   }

其现成的实现有4个:

<李>

emptyCtx:空的情况下,只实现了上下文接口;

<李>

cancelCtx:继承自上下文并实现了cancelerinterface

<李>

timerCtx:继承自cancelCtx,可以用来设置超时;

<李>

valueCtx:可以储存一对键值对,

<强>继承上下文

上下文包提供了一些函数,协助用户从现有上下文的对象创建新的上下文对象。这些上下文对象形成一棵树:当一个上下文对象被取消时,继承自它的所都有上下文会被取消。

背景是所有上下文对象树的根,它不能被取消,它是一个emptyCtx的实例:

var  (   时间=background 才能;新(emptyCtx)   )      func 背景(),Context  {   return 才能;背景   }

<强>生成背景的主要方法

<强> WithCancel

func  WithCancel (parent 上下文),(ctx 上下文,cancel  CancelFunc), {   c 才能;:=,newCancelCtx(父)   propagateCancel才能(父母,,,c)   return 才能和c, func (), {, c.cancel(真的,,取消),}   }

返回一个cancelCtx示例,并返回一个函数,可以在外层直接调用cancelCtx.cancel()来取消上下文。

<强> WithDeadline

func  WithDeadline (parent 上下文,deadline  time.Time),(上下文,CancelFunc), {   if 才能,坏蛋,ok :=, parent.Deadline ();, ok ,,, cur.Before(最后期限),{   ,,,return  WithCancel(父)   ,,}   c 才能;:=,,timerCtx {   ,,,cancelCtx:, newCancelCtx(父),   ,,,截止日期:,最后期限,   ,,}   propagateCancel才能(母公司,c)   d 才能;:=,time.Until(最后期限)   if 才能d  & lt;=, 0, {   ,,,c.cancel(真的,,DeadlineExceeded),//, deadline  has  already 通过   ,,,return  c, func (), {, c.cancel(真的,,取消),}   ,,}   c.mu.Lock才能()   defer 才能;c.mu.Unlock ()   if 才能;c.err ==, nil  {   ,,,c.timer =, time.AfterFunc (d, func (), {   ,,,,,c.cancel(真的,,DeadlineExceeded)   ,,,})   ,,}   return  c、才能,func (), {, c.cancel(真的,,取消),}   }

返回一个timerCtx示例,设置具体的最后期限时间,到最后期限达的时候,后代goroutine退出。

<强> WithTimeout

func  WithTimeout (parent 上下文,timeout  time.Duration),(上下文,CancelFunc), {   return 才能;WithDeadline(母公司,time.Now阀门()(超时))   }

和WithDeadline一样返回一个timerCtx示例,实际上就是WithDeadline包了一层,直接传入时间的持续时间,结束后退出。

<强> WithValue

func  WithValue (parent 上下文,钥匙,,val 界面{}),Context  {   if 才能;key ==, nil  {   ,,,恐慌(“nil  key")   ,,}   if 才能;! reflect.TypeOf(键).Comparable (), {   ,,,恐慌(“key  is  not  comparable")   ,,}   return 才能,valueCtx{母公司,钥匙,,val}   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

如何在Golang中使用上下文方法