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

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吗?选择会被阻止吗?


SMILET
浏览 114回答 1
1回答

呼如林

所有延迟的函数调用都将在函数体运行之后,但在函数返回之前运行,所以是的,延迟取消将在之后执行select。Select 将阻塞直到上下文超时。当 context 超时时,<-ctx.Done()case 将被启用,因此 select 可以在 context 超时后继续。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go