首页 > 其他分享 >go context

go context

时间:2023-07-15 10:11:07浏览次数:35  
标签:context key valueCtx 键值 Context go 节点

使用场景

在协程之间传递上下文

context接口

type Context interface {
    // 返回绑定当前context的任务取消的截止时间
    // 如果没有设定期限,将返回ok == false
    Deadline() (deadline time.Time, ok bool)
    // 绑定当前context的任务取消时返回一个关闭的channel
    // 当前context不会被取消时返回nil
    Done() <-chan struct{}
    // Done返回的channel没有关闭时返回nil
    // Done返回的channel已经关闭时返回非空的值表示任务结束的原因
    // context取消后Err返回Canceled
    // context超时后Err返回DeadlineExceeded
    Err() error
	// Value返回context存储的键值对中key对应的值,没有该key时返回nil
    Value(key interface{}) interface{}
}

emptyCtx

 想象一棵树,树的每个节点可能有一组键值对。如果当前节点上无法找到key对应的值,就会向上去父节点找,直到根节点。
emptyCtx真实类型是int,实现了context接口,没有超时时间,不能取消,不能存储任何额外信息,所以emptyCtx用来作为context树的根节点。
一般使用由emptyCtx实例化的两个变量,分别可以通过调用Background和TODO方法得到,但这两个context在实现上是一样的。
Background和TODO用于不同场景下:
Background通常被用于主函数、初始化以及测试中,作为一个顶层context,一般创建的context都是基于Background;TODO是在不确定使用什么context时才会使用。

valueCtx

type valueCtx struct {
    Context
    key, val interface{}
}

func (c *valueCtx) Value(key interface{}) interface{} {
    if c.key == key {
        return c.val
    }
    return c.Context.Value(key)
}

valueCtx利用一个Context类型的变量来表示父节点context,所以当前context继承了父context的所有信息;valueCtx类型可以携带一组键值对。如果当前context上不存在key,会沿着context链向上寻找key对应的值,直到根节点。

WithValue向context添加键值对

func WithValue(parent Context, key, val interface{}) Context {
    if key == nil {
        panic("nil key")
    }
    if !reflect.TypeOf(key).Comparable() {
        panic("key is not comparable")
    }
    return &valueCtx{parent, key, val}
}

不是在原context结构体上直接添加键值对,以此context作为父节点,重新创建一个新的valueCtx子节点,将键值对添加在子节点上,由此形成一条context链。

参考资料

深入理解Golang之context

标签:context,key,valueCtx,键值,Context,go,节点
From: https://www.cnblogs.com/WJQ2017/p/17555660.html

相关文章

  • R语言中 topGO包的安装
     001、if(!requireNamespace("BiocManager",quietly=TRUE))install.packages("BiocManager")BiocManager::install("topGO",force=TRUE)library(topGO)  。......
  • VSCode - Install/Update gotools
    View-->CommandPaletteInput'gotools'ClickOK.......
  • 说说 Go 语言的坑(二)
    上一篇文章说说Go语言for-range的坑说的是for-range的,工作中,其实还是遇到蛮多奇奇怪怪的问题,这里也顺便整理了一下,就当作是续集:)先继续看for-range的另一个坑:下面代码输出什么?funcmain(){ vara=[]int{1,2,3,4,5} varr=make([]int,0) fori,v:=ran......
  • 在React之下,Context 或者 React-query库该如何选择
    首先,如果是服务器的状态需要用React-query库最方便,如果是客户端的状态用localstate+Context就可以了。 TRANSLATEwithxEnglishArabicHebrewPolishBulgarianHindiPortugueseCatalanHmongDawRomanianChineseSimplifiedHungarianRuss......
  • go text模板
    packageinstallimport("bytes""fmt""strings""text/template""github.com/fanux/sealos/pkg/logger""sigs.k8s.io/yaml")varConfigTypestringfuncsetKubeadmAPI(versionstring){maj......
  • 用googletest写cpp单测
    框架概述GoogleTest(也称为googletest)是由Google开发的C++单元测试框架。它的首个版本是在2004年发布的,作为Google内部的测试框架使用。随后,GoogleTest在开源社区中得到广泛应用,并在许多项目和组织中成为首选的C++单元测试框架。GoogleTest提供了丰富的断言函数和......
  • 鸟类识别系统python+TensorFlow+Django网页界面+卷积网络算法+深度学习模型
    一、介绍鸟类识别系统,使用Python作为主要开发语言,基于深度学习TensorFlow框架,搭建卷积神经网络算法。并通过对数据集进行训练,最后得到一个识别精度较高的模型。并基于Django框架,开发网页端操作平台,实现用户上传一张图片识别其名称。二、效果图片三、演示视频and代码视频+......
  • mongodb报错Sort exceeded memory limit of 104857600 bytes
    mongodb运行过程中,遇到错误信息:2023-07-14T09:29:33.853ERRFailedtoQueryBsPoolUnivStaterror="(QueryExceededMemoryLimitNoDiskUseAllowed)Executorerrorduringfindcommand::causedby::Sortexceededmemorylimitof104857600bytes,butdidnotoptinto......
  • 在批处理中使用【if】和【goto】的例子
    在批处理中使用【if】和【goto】的例子:@echooffremThisscriptassumesthatREAPERisinstalledinC:\ProgramFiles\REAPERremIfyouhaveitinstalledsomewhereelse,modifythisnextlinetopointtotherightfolderremORpassittothescriptlike:reap......
  • mongodb4.4.22主从(副本集附仲裁节点)部署带认证模式
    环境:OS:CentOS7DB:4.4.22机器角色:192.168.1.102:29001主192.168.1.104:29001从192.168.1.105:29001仲裁节点 1.下载相应的版本https://www.mongodb.com/download-center/community我这里下载的是mongodb-linux-x86_64-rhel70-4.4.22.tgz 2.创建安装目录192.168.1.102......