Go语言 会不会是恐慌?

kmbjn2e3  于 2023-02-06  发布在  Go
关注(0)|答案(1)|浏览(132)
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号线之间,我会很恐慌。

5m1hhzi4

5m1hhzi41#

是的,紧急情况是可能发生的。下面是发生紧急情况的时间轴示例。各行按时间顺序递增。N:前缀代表goroutine。
1:启动goroutine 2
2:调用ctx.err(),返回nil
1:调用cancelFunc()
1:关闭通道分析
2:发送到通道anies。由于通道关闭而引起恐慌。

相关问题