[Go] Golang Context 包的注意点
Golang context 包,定义了context 类型,携带截止日期,取消信号,和其它跨API请求作用域及进程间的值。
到服务器的请求应该创建一个 Context,服务器对外的调用应该接受一个Context。
函数之间的调用链必须传递 Context,可选地可以用 WithCancel、WithDeadline、WithTimeout、WithValue 创建的派生 Context。
当一个 Context 取消了,所有的派生 Context 也同样被取消。
WithCancel, WithDeadline, WithTimeout 函数携带一个Context(父级)并且返回一个派生Context(子级)和一个 CancelFunc。
调用 CancelFunc 取消子级和子子级,移除父级到子级的引用,并停止任务相关的定时器。
无法调用 CancelFunc 让子级和子子级泄露,直到父级被取消或者定时器触发。Go vet 工具检测在所有控制流路径上使用的 CancelFuncs。
使用 Context 的程序应该按照这些规则来保持包之间的接口一致和支持静态分析工具检测Context传播:
1.不把 Context 存到一个结构类型中,而是明确传递到每个需要的方法中。Context 应该是第一个参数,一般命名成 ctx:
func DoSomething(ctx context.Context, arg Arg) error {
// ... use ctx ...
}
2.不要传一个 nil Context,即使函数允许。如果不确定使用哪一个 Context,传递一个 context.TODO
3.只对请求作用域的数据如 传输处理和APIs 使用 context 的值。不是作为可选参数传递给函数。
4. 同一个Context 可以传递给 运行在不同 goroutine 里的函数;Context 同时被多个 goroutine 使用是安全的。
Refer:Go SDK/src/context/context.go
Link:https://www.cnblogs.com/farwish/p/15840531.html
[Go] Golang Context 包的注意点的更多相关文章
- Golang Context 包详解
Golang Context 包详解 0. 引言 在 Go 语言编写的服务器程序中,服务器通常要为每个 HTTP 请求创建一个 goroutine 以并发地处理业务.同时,这个 goroutine 也 ...
- Golang context包解读
Context 通常被译作 上下文 ,一般理解为程序单元的一个运行状态.现场.快照,而翻译中 上下 又很好地诠释了其本质,上下上下则是存在上下层的传递, 上 会把内容传递给 下 . 在Go语言中,程序 ...
- golang context包
go context标准库 context包在Go1.7版本时加入到标准库中.其设计目标是给Golang提供一个标准接口来给其他任务发送取消信号和传递数据.其具体作用为: 可以通过context发送取 ...
- Golang Context 的原理与实战
本文让我们一起来学习 golang Context 的使用和标准库中的Context的实现. golang context 包 一开始只是 Google 内部使用的一个 Golang 包,在 Gola ...
- golang中的context包
标准库的context包 从设计角度上来讲, golang的context包提供了一种父routine对子routine的管理功能. 我的这种理解虽然和网上各种文章中讲的不太一样, 但我认为基本上还是 ...
- golang中context包学习
摘要 go语言中goroutine之间的关联关系,缺乏维护,在erlang中有专门的机制来保障新开仟程的生命周期, 在go语言中,只能通过channel + select来实现,但不够直观,感觉很绕. ...
- 【GoLang】golang context channel 详解
代码示例: package main import ( "fmt" "time" "golang.org/x/net/context" ) ...
- Golang Context 详细介绍
Golang context 本文包含对context实现上的分析和使用方式,分析部分源码讲解比价多,可能会比较枯燥,读者可以直接跳过去阅读使用部分. ps: 作者本着开源分享的精神撰写本篇文章,如果 ...
- golang context 剖析 1.7.4 版本
1. 内部结构之 - timerCtx . type timerCtx struct { cancelCtx timer *time.Timer // Under cancelCtx.mu. dead ...
- 带小伙伴手写 golang context
前言 - context 源码 可以先了解官方 context.go 轮廓. 这里捎带保存一份当前 context 版本备份. // Copyright 2014 The Go Authors. Al ...
随机推荐
- 大年学习linux(第五节---目录结构)
五.目录结构 可以用ls / 查看linux的目录结构 bin data etc lib media opt root sbin sys usr boot dev home lib64 mnt pro ...
- drf(认证、权限、频率)
一. 认证组件 1. 流程 1. 写一个类,继承BaseAuthentication,重写authenticate,认证的逻辑写在里面. 认证通过,返回两个值,一个值最终给了包装以后的request对 ...
- 记录--Vue3 封装 ECharts 通用组件
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 按需导入的配置文件 配置文件这里就不再赘述,内容都是一样的,主打一个随用随取,按需导入. import * as echarts from ...
- 原型&继承题目及内容解答
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 1. 代码输出结果 function Person(name) { this.name = name } var p2 = new Per ...
- 记录--分享8个非常实用的Vue自定义指令
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 在 Vue,除了核心功能默认内置的指令 ( v-model 和 v-show ),Vue 也允许注册自定义指令.它的作用价值在于当开发人员 ...
- DNS劫持怎么预防?
DNS劫持,也称为域名劫持,是一种网络攻击手段,攻击者通过拦截域名解析的请求,将用户重定向到恶意站点,以达到获取用户信息或谋取非法利益的目的.DNS劫持可以分为以下几种基本类型: 1.路由器DNS劫持 ...
- 基于电脑软件的任意波形发生器SIG852初识(类似虚拟示波器)
基于电脑软件的任意波形发生器SIG852初识(类似虚拟示波器) 对于从事电路板开发的硬件工程师来说,信号源是经常使用也非常熟悉的.我们用它来作为电路板的输入,测试电路板是否能按预期正常处理这些信号.最 ...
- 解决maven编译错误:程序包com.sun.xml.internal.ws.spi不存在
转自https://blog.csdn.net/mn960mn/article/details/51253038 解决方法如下: 添加maven-compiler-plugin插件,并且配置compi ...
- Scala 惰性加载
1 package com.atguigu.chapter04 2 3 object Test_Lazy { 4 def main(args: Array[String]): Unit = { 5 l ...
- Android按钮_单选框_多选框_文字框
1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android= ...