Golang context包源码分析

Golang:浅析Context包 在golang官方文档中是这样介绍context包的:在context包中定义了context类型来在不同的Goroutine 之间传递上下文,携带截止时间、取消信号以及携带上下文的系统参数(k-v)的类型。对服务器的传入请求应该创建上下文,对服务器的传出调用应该接受上下文。它们之间的函数调用链必须传播上下文,可以选择将其替换为使用WithCancel、WithDeadline、WithTimeout或WithValue创建的派生上下文。 阅读详情

context源码分析

Golang JDK 1.10.3

 

Context介绍

      假如有多个goroutine来处理一个操作,这个操作有超时时间,当超时时间到了之后,如何通知这个操作的所有goroutine都退出。或者在操作的过程中有一个goroutine遇到异常需要退出,如何通知其他的goroutine也退出该操作? context就可以很好的解决以上问题。

     Go服务器的每个请求都有自己的goroutine,而有的请求为了提高性能,会经常启动额外的goroutine处理请求,当该请求被取消或超时,为了防止资源泄露,该请求上的所有goroutines应该退出。那么context来了,它对该请求上的所有goroutines进行约束,然后进行取消信号,超时等操作。

    context优点就是简洁的管理goroutines的生命周期。

 

Context源码分析

1. Context接口

type Context interface {
	Deadline() (deadline time.Time, ok bool)

	Done() <-chan struct{}

	Err() error

	Value(key interface{}) interface{}
}

      Dealine()方法 返回当前上下文的截至时间,即该上下文应该被取消的时间,如果没有设置超时时间,则返回的ok为false

 

      Done()方法 在Context被取消或超时时会close当前监听的channel,close的channel可以作为广播通知,告诉context相关的函数要停止当前工作然后退出。

      创建Context时会返回CancelFunc函数,调用CancelFunc函数以及到了超时时间,会关闭Done()方法监听的channel,所以Done()需要放到select中。

      父Context取消时,其子Context也会被取消。但是子Context取消时,其父Context不会被取消。

      Err()方法 如果Done未关闭,则Err返回nil,如果Done已关闭,则返回非空的error解释原因。

     Value方法通过key获取该key在上下文中关联的值,如果该key没有关联的值,则返回nil,多次调用同一个key,返回的结果是一样的。

 

2. emptyCtx

empty是空的Context,但是实现了Context的接口。emptyCtx没有超时时间,不能被取消,也不能存储任何额外信息,所以emptyCtx常用来作为Context的根节点。

type emptyCtx int

func (*emptyCtx) Deadline() (deadline time.Time, ok bool) {
	return
}

func (*emptyCtx) Done() <-chan struct{} {
	return nil
}

func (*emptyCtx) Err() error {
	return nil
}

func (*emptyCtx) Value(key interface{}) interface{} {
	return nil
}

func (e *emptyCtx) String() string {
	switch e {
	case background:
		return "context.Background"
	case todo:
		return "context.TODO"
	}
	return "unknown empty Context"
}


func Background() Context {
	return background
}


func TODO() Context {
	return todo
}

由于emptyCtx是不能外部访问,所以我们只能用Background和TODO来使用。

Background经常会被使用,经常被当成根节点使用,而TODO在不确定使用什么Context时才会使用。

 

以下使用Background的示例,作为创建出来ctx的父节点

ctx, cancel := context.WithCancel(context.Background())

 

3.cancelCtx

       cancelCtx结构体实现了Context接口,同时也实现了canceler接口,cancelCtx是可以被取消的Context实现,也是context包的核心结构体。当cacel时,它会取消所有子节点中所有实现canceler接口的context。

type cancelCtx struct {
	Context      //指定父级Context

	mu       sync.Mutex            // protects following fields
	done     chan struct{}         // created lazily, closed by first cancel call
	children map[canceler]struct{} // set to nil by the first cancel call
	err      error                 // set to non-nil by the first cancel call  
}

Context是指定父级Context

done 当调用取消函数或超时时,会通过close该channel,来通知上下文。

childer 记录所有实现canceler的子节点

err 第一次调用cancel后会设置一个非空的error,后面可以判断该值是否为空,来判断该上下文是否已经被取消

cancelCtx相关方法

func (c *cancelCtx) Done() <-chan struct{} {
	c.mu.Lock()
	if c.done == nil {
		c.done = make(chan struct{})
	}
	d := c.done
	c.mu.Unlock()
	return d
}

Done()方法其实就是返回的该结构体中的done字段

 

func (c *cancelCtx) Err() error {
	c.mu.Lock()
	defer c.mu.Unlock()
	return c.err
}

返回错误信息

 

func (c *cancelCtx) cancel(removeFromParent bool, err error) {
	if err == nil {
		panic("context: internal error: missing cancel error")
	}
	c.mu.Lock()
	if c.err != nil {  //已经取消,返回
		c.mu.Unlock()
		return // already canceled
	}
	c.err = err
	if c.done == nil {  //如果c.done为nil,则初始化一个closed的chan
		c.done = closedchan
	} else { //不为空则关闭
		close(c.done)
	}
	for child := range c.children {  //cancel该context c的所有字节
		// NOTE: acquiring the child's lock while holding parent's lock.
		child.cancel(false, err)
	}
	c.children = nil  //将该context的children置为nil
	c.mu.Unlock()

	if removeFromParent { //是否删除其parent's context  的children中删除c
		removeChild(c.Context, c)
	}
}

该cancel方法是取消上下文的实现逻辑

(1). 取消当前节点的上下文

   如果当前节点的done为nil,则直接赋值一个关闭的channel。监听一个关闭的channel会直接返回。如果done不为nil,则close。

var closedchan = make(chan struct{})

func init() {
  close(closedchan)
}

closedchan初始化之后,就直接close。这样当监听该close 的channel时就会直接返回。

closedchan示例:

package main

import (
	"fmt"
)

func main() {
	ch := make(chan struct{})
	close(ch)

	select {
	case v, ok := <-ch:
		fmt.Println("ch")
		fmt.Println(v)
		fmt.Println(ok)
	default:
		fmt.Println("default")
	}
}

该示例会走 <-ch case

 

(2).  调用该节点的所有子节点的cancel来取消子节点,以及子节点的子节点.....

(3). removeFromParent为true,则会删除当前节点维护的子节点信息。

 

4.timerCtx结构体

type timerCtx struct {
	cancelCtx
	timer *time.Timer // Under cancelCtx.mu.

	deadline time.Time   //超时时间点
}

从结构体中我们看到,timerCtxt继承了cancelCtx,是在cancelCtx结构体中提供了进一步的扩展。timerCtx可以调用取消函数进行取消,也可以设置超时,当超时时自动取消。

timer 是超时时执行的取消函数

deadline 记录超时的时间点。

 

func (c *timerCtx) Deadline() (deadline time.Time, ok bool) {  //返回deadline,是否创建deadline
	return c.deadline, true
}

Deadline方法用于返回超时的时间点

 

func (c *timerCtx) cancel(removeFromParent bool, err error) {
	c.cancelCtx.cancel(false, err)  //取消该上下文
	if removeFromParent {    //删除该cancelCtx的parent的Context的children c
		// Remove this timerCtx from its parent cancelCtx's children.
		removeChild(c.cancelCtx.Context, c)
	}
	c.mu.Lock()
	if c.timer != nil {  //如果timer不为nil,则停止,避免重复执行cancel
		c.timer.Stop()
		c.timer = nil
	}
	c.mu.Unlock()
}

cancel方法主要调用cancelCtx的cancel进行取消context。

如果timer不为nil,则停止该定时任务,并置为nil。

 

5.初始化Context

上面我们提到Background()函数可以返回emptyCtx对象,常用来作为根节点。

其他对外提供的Context初始化方法为:WithCancel、WithDeadline和WithTimeout。

 (1). 通过WithCancel初始化Context

func WithCancel(parent Context) (ctx Context, cancel CancelFunc) {
	c := newCancelCtx(parent)   //初始化一个cancelCtx,并指定父级Context为parent
	propagateCancel(parent, &c)
	return &c, func() { c.cancel(true, Canceled) }
}

func newCancelCtx(parent Context) cancelCtx {
	return cancelCtx{Context: parent}
}

func propagateCancel(parent Context, child canceler) {
	if parent.Done() == nil {   //如果parent的Done()为nil,说明父级没有cancel,直接返回
		return // parent is never canceled
	}
	if p, ok := parentCancelCtx(parent); ok {  //parent的Contex实现类是cancelCtx
		p.mu.Lock()
		if p.err != nil {   //parent已经被取消
			// parent has already been canceled
			child.cancel(false, p.err)
		} else {
			if p.children == nil {  //如果p的children未初始化,则进行初始化
				p.children = make(map[canceler]struct{})
			}
			p.children[child] = struct{}{}   //指定改parent的children
		}
		p.mu.Unlock()
	} else {  //parent的Contex实现类不是是cancelCtx
		go func() {
			select {
			case <-parent.Done():  //当parent关闭时,关闭children
				child.cancel(false, parent.Err())
			case <-child.Done():
			}
		}()
	}
}

      WithCancel方法首先调用newCancelCtx初始化一个cancelCtx对象,并指定该对象的Context。

       propagateCancel方法的主要功能是如果指定的父节点是cancelCtx类型的,则将当前创建的节点维护到父节点中(通过父节点的children关联)。并且实现当父节点取消时,当前子节点也会被取消。

 

 (2). 通过WithDeadline初始化Context

func WithDeadline(parent Context, d time.Time) (Context, CancelFunc) {
	//ok:是否设置deadline,cur设置超时时间
	if cur, ok := parent.Deadline(); ok && cur.Before(d) {
		// The current deadline is already sooner than the new one.
		//设置超时时间 晚于 父级parent的超时时间,则调用WithCancel(parent)创建
		return WithCancel(parent)
	}
	c := &timerCtx{
		cancelCtx: newCancelCtx(parent),   //初始化cancelCtx
		deadline:  d,  //记录超时时间点
	}
	propagateCancel(parent, c)  //实现子级与父级关联,当父级cancel时,子级也cancel
	dur := time.Until(d)  //获取d到当前时间的duration
	if dur <= 0 {   //dur 小于 0,超时时间已过
		c.cancel(true, DeadlineExceeded) // deadline 已过,调用cancel函数取消
		return c, func() { c.cancel(true, Canceled) }
	}
	c.mu.Lock()
	defer c.mu.Unlock()
	if c.err == nil {  //到dur时间之后,调用c.cancel()函数,由系统新建goroutine执行
		c.timer = time.AfterFunc(dur, func() {
			c.cancel(true, DeadlineExceeded)
		})
	}
	return c, func() { c.cancel(true, Canceled) }
}

WithDeadline方法创建的Context,不仅可以通过手动调用取消函数取消,也可以指定超时的时间点,如果超时则会自动取消。主要通过timerCtx实现以上取消功能。

1. 如果创建的子节点的超时时间比父节点的超时时间还晚,则无需使用timerCtx创建,因为父节点取消时,该节点也会创建。所以直接调用WithCancel创建。

2. 如果晚于父节点,则会创建timerCtx对象,并调用propagateCancel实现与父节点的关联。

3. 如果超时时间已到,则直接调用取消函数。否则开启一个定时器到超时时间点触发取消函数。

 

 (3). 通过WithDeadline初始化Context

func WithTimeout(parent Context, timeout time.Duration) (Context, CancelFunc) {
	return WithDeadline(parent, time.Now().Add(timeout))
}

WithTimeout 等同于 WithDeadline(parent, time.Now().Add(timeout))

Go语言Context全解析 文章目录说明背景介绍责任与边界知识点的准备与复习标准库的默认实现使用场景链路信息取消超时控制部分源码解读参考链接 说明 此篇博客只介绍 go语言 context 包的用法以及使用场景,适度的做一些源码分析,但不会太深入。go语言的context包设计非常巧妙,非常值得学习,在学习的时候,不要只盯着一个东西学,而要学会迁移学习。比如在这个包当中涉及到了一些别的知识,比如time包的用法,go语言channel的用法,等等。学完此节,相信你会对我刚刚提到的那些知识点又有新的领悟。 背景介绍 在go语言编写的服务 阅读详情

相关推荐

Golang context包的源码分析

context.go文件里面,主要有4个struct体,都继承Context接口;四个struct体 分别是emptyCtx、cancelCtx、timerCtx、valueCtx。提供了获取对应结构体的方法:WithCancel,WithDeadline,WithTimeout,WithValue;结构如图:我们就按照这个顺序,分别介绍对应的Context。

飞越蓝天的专栏 373

Golang Context包详解

Golang Context包详解 引言: 在Go语言编写服务器程序中,服务器通常要为每个 HTTP 请求创建一个 goroutine 以并发地处理业务。同时,这个 goroutine 也可能会创建更多的 goroutine 来访问数据库或者 RPC 服务。当这个请求超时或者被终止的时候,需要优雅地退出所有衍生的 goroutine,并释放资源。因此,我们需要一种机制来通知衍生 goroutine 请求已被取消。 比如以下例子,sleepRandom_1的结束就无法通知到sleepRandom_...

zuiyijiangnan的博客 1028

TPS65987D USB PD控制器:从原理到实战的完整设计指南

USB PD(Power Delivery)协议是USB Type-C接口实现高功率快充和数据传输的核心技术标准。其工作原理基于CC(Configuration Channel)引脚的双相标记编码(BMC)通信,通过协商电压和电流,实现高达100W的功率传输。这项技术的核心价值在于统一了充电标准,简化了设备间的互操作性,广泛应用于笔记本电脑、移动电源、扩展坞等设备。TPS65987D作为一款高度集成的USB PD控制器,将复杂的协议处理、电源路径管理和多重保护电路集成于单芯片,显著降低了设计复杂度。通过其可

weixin_30983965的博客 339

Golang context 实现原理与源码分析

context实际上只定义了接口,凡是实现该接口的类都可称为是一种context,官方包中实现了几个常用的context,分别可用于不同的场景; - cancelCtx实现了Context接口,通过`WithCancel()`创建cancelCtx实例; - timerCtx实现了Context接口,通过`WithDeadline()`和`WithTimeout()`创建timerCtx实例; - valueCtx实现了Context接口,通过`WithValue()`创建valueCtx实例;

Pistachiout的学习博客 1813

探索LLM世界:新手小白的学习路线图

通过系统的学习和实践,新手小白也能逐步掌握LLM的核心技术。掌握LLM不仅能提升个人技术水平,还能为职业发展带来广阔的前景。未来,随着技术的不断进步,LLM将在更多领域发挥重要作用,成为推动科技进步的重要力量。学习LLM是一条充满挑战但也充满机遇的道路。只要你坚持不懈、不断学习和实践,就一定能够在LLM领域取得突破。希望本文提供的学习路线图能为你指明方向,助你早日掌握LLM,开启AI学习的新篇章!

m0_62110645的博客 2360

Datalog语言详解

Datalog是一种声明式逻辑编程语言,起源于数据库理论和逻辑编程领域。作为Prolog的子集,它专注于递归查询和推理,通过定义事实和规则来描述数据关系而非计算步骤。Datalog的关键特性包括规则安全、递归、分层否定和扩展聚合功能,保证了程序的终止性和高效性。相较于SQL,Datalog更擅长处理递归查询;相比Prolog,它更注重数据库友好性。Datalog在程序分析、知识图谱、网络安全等领域有广泛应用,其声明式特性使代码简洁易维护,但同时也面临生态系统小、性能调试难等挑战。现代工具如Soufflé、D

bulita great world 1849

golang的context包详解 带源码

golang-context知识总结,通过这篇文档彻底弄懂golang-context包

qq_43415406的博客 520

手把手教你用AI工具快速开发UniApp首页:从设计稿到完整页面的实战流程

本文详细介绍了如何利用Claude Code、Cursor等AI工具高效开发UniApp首页的完整工作流。从设计稿解析、Prompt工程、代码生成优化到调试适配,提供了一套可复用的实战流程,帮助前端开发者大幅提升从设计到代码的转化效率。

weixin_29199873的博客 318

Golang 上下文context源码走读

本文是对Goroutine context的关键源码进行走读,并记录使用时容易犯的一些错误。示例可能来源于网络、各类书籍,对应的Golang版本是1.21.9,仅供个人学习使用。

1880

PostgreSQL+PostGIS实战:5分钟搞定Shapefile数据导入(附避坑指南)

本文详细介绍了如何使用PostgreSQL和PostGIS快速导入Shapefile空间数据,包括5分钟标准流程和常见问题解决方案。通过实战案例和避坑指南,帮助GIS工程师高效处理矢量数据导入中的编码、几何类型、坐标系等典型问题,提升空间数据库管理效率。

weixin_42565652的博客 400

【OpenClaw从入门到精通】第66篇:Skill开发进阶——从零打造一个跨境选品Skill(附完整代码)(2026实测版)

2026年跨境电商效率革命中,AI Agent已成为选品核心工具,但通用Skill难以适配个性化需求。本文以“跨境选品”为实战场景,从零讲解OpenClaw Skill的完整开发流程:从需求分析、目录结构设计、SKILL.md编写,到Python脚本开发(含1688商品搜索、销量分析、竞品对比核心功能),再到调试测试、安全审计与ClawHub发布。文中提供可直接复制的完整代码,覆盖多平台适配、异常处理、数据可视化等进阶功能,同时解决API调用、链接失效等实际问题。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 567

Golang Context 实战与源码分析

如果父节点context的deadline早于本次创建子节点的deadline,那就没必要给子节点创建一个timerCtx了,因为根据deadline来看,父节点肯定会早与这个子节点取消,而父节点取消后,子节点也会跟着被取消,所以没必要给子节点创建timer,直接创建一个cancelCtx将子节点挂到父节点上就行了,效果是一样的,还剩下一个timer。注这里的数据传递主要指全局数据,如链路追踪里的traceId之类的数据,并不是普通的参数传递(也非常不推荐用来传递参数)。...

Bel_Ami_n的博客 338

【GlobalMapper精品教程】084:tif(tfw)、jpg(jgw)、png(pgw)的区别与联系

摘要:本文介绍了TFW、JGW、PGW等地理参考文件的基本原理和应用。这些文件通过简单的文本格式存储栅格图像的地理坐标信息,适用于平面坐标系下的GIS数据处理。文章详细说明了文件各行的含义,并提供了在ArcGIS和Globalmapper中生成这些文件的具体操作步骤,包括导出TIFF、JPG、PNG格式时勾选生成对应坐标文件的选项。这些文件虽然简单易用,但仅适用于平面坐标系,且功能相对有限。配套视频教程提供了更详细的操作演示。

智慧空间实验室 2403

Golang源码分析

Golang源码分析 Golang源码分析-builtin.go Golang源码分析-bytes.go Golang源码分析-bytes/buffer.go Golang源码分析-bytes/reader.go Golang源码分析-strings.go Golang源码分析-strings builder.go Golang源码分析-strconv包 Golang源码分析-io.go Golang源码分析-io/pipe.go Golang源码分析-io/ioutil.go Gol

hixiaoyang的博客 793

深度解析电力负荷预测:基于深度学习的完整实战指南

电力负荷预测是智能电网运行中的核心技术之一,准确的负荷预测对于电网的稳定运行、电力市场交易以及能源调度具有重要意义。本文将详细介绍电力负荷预测的完整解决方案,从数据预处理、特征工程到模型构建与评估,提供完整的可执行代码。我们将使用LSTM(长短期记忆网络)和Transformer两种主流深度学习模型进行实现,并通过实际数据集验证模型效果。电力负荷预测是指根据历史负荷数据、气象因素、时间特征等多维信息,预测未来某一时段的电力需求。超短期负荷预测:未来几分钟到几小时短期负荷预测:未来1天到1周中期负荷预测。

YOLO 111

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

gin context和官方context_Golang源码分析系列之官方Context包

Context简介Context是由Golang官方开发的并发控制包,一方面可以用于当请求超时或者取消时候,相关的goroutine马上退出释放资源,另一方面Context本身含义就是上下文,其可以在多个goroutine或者多个处理函数之间传递共享的信息。创建一个新的context,必须基于一个父context,新的context又可以作为其他context的父context。所有context...

weixin_31972679的博客 1064

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

golang stmt 绑定变量_Golang源码分析系列之官方Context包

Context简介Context是由Golang官方开发的并发控制包,一方面可以用于当请求超时或者取消时候,相关的goroutine马上退出释放资源,另一方面Context本身含义就是上下文,其可以在多个goroutine或者多个处理函数之间传递共享的信息。创建一个新的context,必须基于一个父context,新的context又可以作为其他context的父context。所有context...

weixin_39995943的博客 98

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

返回包禁止返回server_Go 源码分析(2):context 包

应用场景:在 Go http 包的 Server 中,每一个请求在都有一个对应的goroutine去处理。请求处理函数通常会启动额外的goroutine用来访问后端服务,比如数据库和 RPC 服务。用来处理一个请求的goroutine通常需要访问一些与请求特定的数据,比如终端用户的身份认证信息、验证相关的 token、请求的截止时间。当一个请求被取消或超时时,所有用来处理该请求的goro...

weixin_39619478的博客 158

go http 取消请求_Go 源码分析(2):context 包

应用场景:在 Go http 包的 Server 中,每一个请求在都有一个对应的goroutine去处理。请求处理函数通常会启动额外的goroutine用来访问后端服务,比如数据库和 RPC 服务。用来处理一个请求的goroutine通常需要访问一些与请求特定的数据,比如终端用户的身份认证信息、验证相关的 token、请求的截止时间。当一个请求被取消或超时时,所有用来处理该请求的goro...

weixin_39568597的博客 142

深入解析Golang之Context

​context是什么 context翻译成中文就是上下文,在软件开发环境中,是指接口之间或函数调用之间,除了传递业务参数之外的额外信息,像在微服务环境中,传递追踪信息traceID, 请求接收和返回时间,以及登录操作用户的身份等等。本文说的context是指golang标准库中的context包。Go标准库中的context包,提供了goroutine之间的传递信息的机制,信号同步,除此之外还有超时(timeout)和取消(cancel)机制。概括起来,Context可以控制子goroutine的运行,

数据小冰的博客 5030

Go语言之 Context 实战与源码分析

本文主要简单介绍了Go语言(golang)中的context包。给出了context 的基本用法和使用建议,并从源码层面对其底层结构和具体实现原理进行分析。 1. 概述 以下分析基于 Go 1.17.1 1.1 什么是 Context 上下文 context.Context在Go 语言中用来设置截止日期、同步信号,传递请求相关值的结构体。上下文与 Goroutine 有比较密切的关系,是 Go 语言中独特的设计,在其他编程语言中我们很少见到类似的概念。 主要用于超时控制和多Goroutine间

dz45693的专栏 2805

Go context 超时控制

常见方法 context.WithTimeout(parent Context, timeout time.Duration) (Context, CancelFunc) // 指定时长超时结束 context.WithCancel(parent Context) (ctx Context, cancel CancelFunc) // 手动结束 context.WithDeadline(parent Context, d time.Time) (Context, CancelFunc) // 指定时间结束

稻草人技术博客 2680

go语言context包源码解析

go语言context包源码解析 由于需要转go,学了基础和一些服务端框架后决定对go的一些源码进行阅读,并适当去实现。第一份源码就看了context,下面对context进行详细的解读。 ...

outsider 686

golang return要返回的参数太多_深入Golang系列(一)Context

“Golang让开发变得高效有趣已经成为一个不争的事实。事实上,极低的开发门槛带来的最大的问题在于,开发者甚至不需要对一个概念(包)进行过多的了解即可写出满足需要的程序。长久以往,写出的程序在健壮性,可维护性上都大打折扣。”本篇作为深入Golang系列的一个开篇,将从实际开发入手,对于平日常见的,却又用不好的包:context,进行一个全面的割析,希望能够对今后的开发工作有所帮助。01...

weixin_42365898的博客 579

go context专题(三)- context 工作机制和代码分析

go context专题(二)- context 设计思想和用法

Andes Home 千年的塔 -十年技术,风雨兼程 1271

【Go】源码学习:context包

一、概述 context包是在go1.7版本中从golang.org/x/net/context包挪入到标准库中。从标准库的GOROOT/src/context包下我们研究分析源码可以看到其底层实现是基于一个Context interface及其实现类(strcut)来实现: 对一个无缓冲channel的关闭,使 <-context.Done()可执行通过。 使用map实现对子孙context进行包裹,便后续可拿到child(子孙context)进行cancel()操作。 对执行完cancel()的

ZT 302
上一篇: Golang bytes包Buffer源码分析
下一篇: Golang io/ioutil包源码分析
思维的深度
博客等级 码龄11年 2万+粉丝 391原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值