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 发生在 line2 和 line3 之间时,我会感到恐慌。
是的,恐慌是可能的。以下是发生恐慌的时间线示例。这些行按时间递增顺序排列。 N: 前缀代表 goroutine。
1:启动协程2
2:调用ctx.Err(),它返回nil
1:调用cancelFunc()
1:关闭通道anis
2:发送到aniy频道。恐慌,因为通道已关闭。
以上是这里可能会出现恐慌吗?的详细内容。更多信息请关注PHP中文网其他相关文章!