zoukankan      html  css  js  c++  java
  • 【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
    ", 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变量(通常作为函数的第一个参数)会像病毒一样蔓延在各处调用它的地方。
    
  • 相关阅读:
    c++ 为自定义类添加stl遍历器风格的遍历方式
    C++ 生成随机数
    c/c++ 函数说明以及技巧总结
    XSLT 教程
    C# 高效过滤DataTable 中重复数据方法
    xml获取指定节点的路径
    TreeView控件
    推荐一些C#相关的网站、资源和书籍
    C#多线程操作
    C#二进制序列化
  • 原文地址:https://www.cnblogs.com/ahfuzhang/p/12891457.html
Copyright © 2011-2022 走看看