做好每一件事,读好每一本书,天道酬勤
go_context(1)
2022-04-08 / 3 min read

一直对context这个东西保持一个神秘感,今天对这部分内容进行了一个查看,可能理解不是很到位。

context是什么

首先对于context这个东西到底是什么,在之前我的学长们总是给说什么上下文,但是呢我总是不理解这个东西,上下文???一脸的问号,什么是上下文?
在我们交流的语言中呢,比如英语这个玩意(我贼垃圾),比如一个单词在这里是这个意思,但是换个地方他就不是那个意思了,,,emm也不知道大家理解没有,大概就是这个意思。
然后官方一点的回答,什么是context。这个东西是怎么产生的。
其实这个东西是在go1.17的时候加入的官方库的,具体的产生和go的并发是有关系的,在go的编程中最重要的东西就是channel和goroutine这两个玩意。在我们写go程序的时候,我们需要调用函数,在调用的时候很有可能我们会开启一连串的goroutine,那么我们怎么来达到一个特殊数据的一些传递和对goroutine的关闭呢?通过信号量这个玩意,使用sync.Wait来对它进行一个信号量的管理,其实这样肯定是不好的。所以我们的contxet就诞生了。

简单的来说:context的作用就是在不同的goroutine之间进行同步,请求特定的数据取消信号量以及处理请求的截止时间。

context的使用

现在我们来看一下这个玩意我们应该怎么使用

Context创建

要想使用那么第一步肯定就是对这个东西的创建。
context包主要提供了两种方式创建context:

  • context.Backgroud()
  • context.TODO()
  • 这两个函数其实只是互为别名,没有差别,官方给的定义是:
    context.Background 是上下文的默认值,所有其他的上下文都应该从它衍生(Derived)出来。
    context.TODO 应该只在不确定应该使用哪种上下文时使用;
    所以在大多数情况下,我们都使用context.Background作为起始的上下文向下传递。
    我们可以查看一下这部分的源码:

    我们可以很清楚的看见,这两个最后返回的东西其实是一样的。

四个重要的函数

我们创建过后,我们可以看到他可以调用的四个重要函数

func WithCancel(parent Context) (ctx Context, cancel CancelFunc)
func WithDeadline(parent Context, deadline time.Time) (Context, CancelFunc)
func WithTimeout(parent Context, timeout time.Duration) (Context, CancelFunc)
func WithValue(parent Context, key, val interface{}) Context

这里我们看到了这个四个重要的函数,这里我们简单的说一下它是干什么用的,后面我再对四个函数进行一个详细的学习和总结

WithValue携带数据

WithTimeout超时控制

withCancel取消控制

WithDeadline就是对withCancel取消控制的调用