-
比较
-
传值传引用
基本类型都是传值
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
网友评论