美文网首页
go简记-context

go简记-context

作者: n_xy | 来源:发表于2021-04-09 21:01 被阅读0次
    1. 比较

    2. 传值传引用
      基本类型都是传值

    context包

    主要结构context

    type Context interface {  
      //传入截止日期,到期自动关闭context,释放资源
      Deadline() (deadline time.Time, ok bool)
      //在取消时关闭,用来做通知用
      Done() <-chan struct{}
     //在Done通道关闭后返回一个非空值,说明原因
     //eg,调用cancel()后 Err()返回context canceled
      Err() error
      Value(key interface{}) interface{}
    }
    

    首先context是线程安全的

    创建

    context.Background() Context

    这个函数返回一个空 context。这只能用于高等级(在 main 或顶级请求处理中)。这能用于派生我们稍后谈及的其他 context 。

    context.TODO() Context

    它与 background 完全相同。用在当前context还没有明确用途的时候,相当于一个占位符

    context.WithValue(parent Context, key, val interface{}) Context

    此函数接收 context 并返回派生 context,其中值 val 与 key 关联,并通过 context 树与 context 一起传递。这意味着一旦获得带有值的 context,从中派生的任何 context 都会获得此值。不建议使用 context 值传递关键参数,而是函数应接收签名中的那些值,使其显式化

    context.WithCancel(parent Context) (ctx Context, cancel CancelFunc)

    也是派生一个cintext,不同的是返回一个取消函数,当调用cancel或者父context的Done关闭时,返回的context的Done通道应该关闭.
    示例

    func main() {
        gen := func(ctx context.Context) <- chan int{
            dst :=make(chan int)
            n:=1
            go func(){
                for{
                    select {
                    case a:=<-ctx.Done():
                        fmt.Println("done   ",a)
                        return
                    case dst <-n:
                         n++
                    }
                }
            }()
            return dst
        }
    
        cxt ,cancel :=context.WithCancel(context.Background())
    
        for n:= range gen(cxt){
            fmt.Println(n)
            if n==6{
                break
            }
        }
        cancel()
        time.Sleep(3*time.Second)
    }
    

    当cancel执行后 相应的xontext的Done方法会关闭,接收方会收到一个{}来进行通知

    WithDeadline(parent Context, deadline time.Time) (Context, CancelFunc)

    给一个截止时间到期关闭context,之前可以通过父context或者concel()关闭

    WithTimeout(parent Context, timeout time.Duration) (Context, CancelFunc)

    就是上边的加了点时间WithTimeout returns WithDeadline(parent, time.Now().Add(timeout)).

    WithValue(parent Context, key, val interface{})Context

    返回传入context的副本,kay-value为关联的数据,可用通过Context的Value(key)方法查找value, key不能是字符串类型和内置的类型,应该如下

    type key int
    type key string
    

    相关文章

      网友评论

          本文标题:go简记-context

          本文链接:https://www.haomeiwen.com/subject/ieztkltx.html