问一个 Go 程序的执行问题
下面的代码中,我虽然知道了 1s 之后,会执行 case <-ctx.Done() 这个 case 。但是我想搞清楚原理:
我有一个疑问:
- defer cancel() 是需要等到 main 函数返回才可以执行
- 从程序代码中看,下面的程序中,执行 select 的时候,都会阻塞住才对
- 如果 select 都会阻塞住的话,那就没有办法执行 return 了,如果没有执行 return 的话,那就不应该执行 defer cancel() 才对
package main
import (
"context"
"fmt"
"time"
)
const shortDuration = 1 * time.Second
func main() {
timeNow := time.Now()
ctx, cancel := context.WithTimeout(context.Background(), shortDuration)
defer cancel()
select {
case <-time.After(2 * time.Second):
fmt.Println("overslept")
case <-ctx.Done():
fmt.Println(ctx.Err())
}
fmt.Println(time.Since(timeNow))
}