为了账号安全,请及时绑定邮箱和手机立即绑定

关于 Go 中的“defer”和“select”键

关于 Go 中的“defer”和“select”键

Go
SMILET 2022-10-10 19:57:05
func TestContext(t *testing.T){    message:=make(chan int,10)    //producer    for i:=0;i<10;i++{        message<-i    }        //consumer    ctx,cancel:=context.WithTimeout(context.Background(),time.Second*5)    go func(ctx context.Context) {            ticker := time.NewTicker(1 * time.Second)            for _ = range ticker.C {                 select {                case <-ctx.Done():                    fmt.Println("child process interrupt...")                    return                default:                    fmt.Printf("send message: %d\n", <-message)                }            }        }(ctx)        defer close(message)    defer cancel()    select{        case <-ctx.Done():            //time.Sleep(1*time.Second)            fmt.Println("main process exit!")    }}Q1:“延迟取消”什么时候执行?选择后?Q2:Q1中,如果在select后执行“defer cancel”,ctx.Done()会返回nil吗?选择会被阻止吗?
查看完整描述

1 回答

?
呼如林

TA贡献1798条经验 获得超3个赞

所有延迟的函数调用都将在函数体运行之后,但在函数返回之前运行,所以是的,延迟取消将在之后执行select

Select 将阻塞直到上下文超时。当 context 超时时,<-ctx.Done()case 将被启用,因此 select 可以在 context 超时后继续。


查看完整回答
反对 回复 2022-10-10
  • 1 回答
  • 0 关注
  • 113 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信