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变量(通常作为函数的第一个参数)会像病毒一样蔓延在各处调用它的地方。
    
  • 相关阅读:
    置换加密算法
    堆和优先队列的应用
    定时发送邮件小程序
    Hibernate的缓存
    Spring中使用JDBC
    Spring AOP(创建切面)
    处理不可中断阻塞
    SQL语句实例说明
    spring_声明式事务
    Flex_includeIn属性的作用
  • 原文地址:https://www.cnblogs.com/ahfuzhang/p/12891457.html
Copyright © 2011-2022 走看看