美文网首页
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

    比较 传值传引用基本类型都是传值 context包 主要结构context 首先context是线程安全的 创建 ...

  • GO 语言context.Context类型

    context.Context类型 context.Context类型(以下简称Context类型)是在Go 1....

  • Golang Context 详细原理和使用技巧

    Golang Context 详细原理和使用技巧 Context 背景 和 适用场景 Context 的背景 Go...

  • go context

    Req-->a-->c--->b---->return (链式调用) 链式调用和我们普通的函数调用是存在差别的:函...

  • Go context

    goroutine要处理的问题? 数据共享 释放回收 github练习代码 context doc blog...

  • Go context

    Go context 在RPC或者Web服务中,当Server端接受一个request的时候,都会开启一个额外的g...

  • Go context

    控制并发有两种经典的方式:WaitGroup和Context WaitGroup:控制多个Goroutine同时完...

  • go context

    context 很重要,总体作用就是 设置程序执行的 deadline 设置程序的截止日期 status...

  • go context

    https://zhuanlan.zhihu.com/p/110085652

  • go context

    [TOC]相信大家在日常工作开发中一定会看到这样的代码: context被当作第一个参数(官方建议),并且不断透传...

网友评论

      本文标题:go简记-context

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