func main() {
rand.Seed(time.Now().Unix())
ctx, cancelFunc := context.WithCancel(context.Background())
anies := make(chan any)
go doSomething(ctx, anies)
intn := rand.Intn(2)
if intn == 0 { //BRANCH1
cancelFunc()
close(anies)
}
time.Sleep(time.Second)
}
func doSomething(ctx context.Context, anies chan any) {
for {
if ctx.Err() == nil { //LINE2
anies <- 1 //LINE3
}
}
}
有没有可能BRANCH1发生在2号线和3号线之间,我会很恐慌。
1条答案
按热度按时间5m1hhzi41#
是的,紧急情况是可能发生的。下面是发生紧急情况的时间轴示例。各行按时间顺序递增。N:前缀代表goroutine。
1:启动goroutine 2
2:调用ctx.err(),返回nil
1:调用cancelFunc()
1:关闭通道分析
2:发送到通道anies。由于通道关闭而引起恐慌。