【get√】golang新手理解了一点点context
测试代码如下:
package practice
import (
"context"
"log"
//"fmt"
"time"
)
func g1_1(ctx context.Context){
log.Println(ctx.Value("key1"))
ctx_b := context.Background()
log.Println(ctx_b.Value("key1"))
}
func g1(ctx context.Context){
log.Println(ctx.Value("key1"))
ctx1 := context.WithValue(ctx, "key1", "v1_g1")
go g1_1(ctx1)
}
func g2(ctx context.Context){
log.Println(ctx.Value("key1"))
ctx1 := context.WithValue(ctx, "key1", "v1_g2")
go g1_1(ctx1)
}
func MyContext(){
log.SetFlags(log.LstdFlags | log.Lshortfile)
ctx := context.Background()
log.Printf("%+v\n", ctx)
ctx1 := context.WithValue(context.Background(), "key1", "v1")
log.Println(ctx1.Value("key1"))
go g1(ctx1)
go g2(ctx1)
time.Sleep(time.Duration(5)*time.Second)
}
打印结果如下:
2020/05/14 20:50:06 context_t.go:31: context.Background
2020/05/14 20:50:06 context_t.go:34: v1
2020/05/14 20:50:06 context_t.go:23: v1
2020/05/14 20:50:06 context_t.go:17: v1
2020/05/14 20:50:06 context_t.go:11: v1_g2
2020/05/14 20:50:06 context_t.go:13: <nil>
2020/05/14 20:50:06 context_t.go:11: v1_g1
2020/05/14 20:50:06 context_t.go:13: <nil>
我的理解:
- context.WithValue()创建出新的context后,相当于一颗树上开出新的分支
- 因此,不会像全局变量一样存在全局竞争。一个context可以用于向下级树传递值。
- 没办法通过类似parent的方法获得树的上级节点。
- 调用context.Background()始终是根节点。
还是比较赞同这篇文章的说法:Golang Context 是好的设计吗?
一旦代码中某处用到了Context,传递Context变量(通常作为函数的第一个参数)会像病毒一样蔓延在各处调用它的地方。
【get√】golang新手理解了一点点context的更多相关文章
- 【get√】golang新手理解了一点点gin框架的中间件
1.通过use()来使用多个中间件 router := gin.New() router.Use( middleware1, middleware2) 2.中间件的典型实现 func Logger() ...
- 新手理解HTML、CSS、javascript之间的关系-修订
几年前写过一篇博文 <新手理解HTML.CSS.javascript之间的关系>,没想到网上出现了不少转载,当时没有太用心,里面的很多内容有待商榷,这里发布重新发布一篇. 网页主要有三部分 ...
- Golang 新手可能会踩的 50 个坑【转】
译文:https://github.com/wuYin/blog/blob/master/50-shades-of-golang-traps-gotchas-mistakes.md 原文:50 Sha ...
- Golang 新手可能会踩的 50 个坑
前言 Go 是一门简单有趣的编程语言,与其他语言一样,在使用时不免会遇到很多坑,不过它们大多不是 Go 本身的设计缺陷.如果你刚从其他语言转到 Go,那这篇文章里的坑多半会踩到. 如果花时间学习官方 ...
- 绝对让你理解Android中的Context
这个问题是StackOverFlow上面一个热门的问题What is Context in Android? 整理这篇文章的目的是Context确实是一个非常抽象的东西.我们在项目中随手都会用到它,但 ...
- Golang 高效实践之并发实践context篇
前言 在上篇Golang高效实践之并发实践channel篇中我给大家介绍了Golang并发模型,详细的介绍了channel的用法,和用select管理channel.比如说我们可以用channel来控 ...
- Android中Context的理解及使用(一)——Context的作用
Context的作用:用来访问全局信息的接口,通过Context进行资源的访问. 1.Context获取字符串资源: public class MainActivity extends AppComp ...
- 新手理解HTML、CSS、javascript之间的关系
http://www.cnblogs.com/dreamingbaobei/p/5062901.html 工作多年,一直忙忙碌碌的应用各种技术,现在不忙了,问问自己究竟在做什么,究竟会什么竟答不上来, ...
- spring两大核心对象IOC和AOP(新手理解)
现在自己对spring的理解是:spring的主要的作用是用来进行业务的处理和实现类与类之间的解耦. 其中实现解耦功能 是IOC(控制反转)通过sessionfactory工厂来为需要的对象注入对应的 ...
随机推荐
- Mysql 表名忽略大小写-连接字符集随笔记录
1.参数说明: lower_case_table_names=0 表名存储为给定的大小和比较是区分大小写的 lower_case_table_names = 1 表名存储在磁盘是小写的,但是比较的时候 ...
- 电压-电流转换(一):4-20mA电流环
在仪表电路中,直流信号通常用作物理测量值的模拟表示,例如温度.压力.流量.重量和运动.最常见的是,直流电流信号优先于直流电压信号使用,因为在从电源(测量设备)到负载(指示器.记录仪或控制器)的整个串联 ...
- SpringBoot 封装异步执行任务简单demo
ThreadPoolConfig.java import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.concurrent.B ...
- SpringCloud使用GateWay网关前端请求请求跨域处理
增加配置类 CorsConfig.java import org.springframework.context.annotation.Bean; import org.springframework ...
- 基于DNN的残余回声抑制
摘要 由于功率放大器或扬声器的限制,即使在回声路径完全线性的情况下,麦克风捕获的回声信号与远端信号也不是线性关系.线性回声消除器无法成功地消除回声的非线性分量.RES是在AES后对剩余回声进行抑制的一 ...
- UDP&串口调试助手用法(4)
接收配置用法 概览 保存文件 可将数据保存到文件和文件夹 如果选择的时文件,则需要自己手动选择保存的文件. 如果选择的时文件夹,则需要指定文件夹的类型和文件的后缀 支持保存文件类型: 文本文件和二进制 ...
- 【LeetCode】599. Minimum Index Sum of Two Lists 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 方法一:找到公共元素再求索引和 方法二:索引求和,使 ...
- 【LeetCode】784. Letter Case Permutation 解题报告 (Python&C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 回溯法 循环 日期 题目地址:https://leet ...
- Blazor组件的new使用方式与动态弹窗
1. 前言 在Blazor中的无状态组件文中,我提到了无状态组件中,有人提到这个没有diff,在渲染复杂model时,性能可能会更差.确实,这一点确实是会存在的.以上文的方式来实现无状态组件,确实只要 ...
- JQuery的安装与下载教程
网页中添加 jQuery 可以通过多种方法在网页中添加 jQuery. 您可以使用以下方法: 从 jquery.com 下载 jQuery 库 从 CDN 中载入 jQuery, 如从 Google ...