程序开发 · 2023年12月24日

这里可能会出现恐慌吗?

当前位置: > > > > 这里可能会出现恐慌吗?

来源:stackoverflow
2024-04-21 10:21:26
0浏览
收藏

哈喽!大家好,很高兴又见面了,我是的一名作者,今天由我给大家带来一篇《这里可能会出现恐慌吗?》,本文主要会讲到等等知识点,希望大家一起学习进步,也欢迎大家关注、点赞、收藏、转发! 下面就一起来看看吧!

问题内容

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频道。恐慌,因为通道已关闭。

本篇关于《这里可能会出现恐慌吗?》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于Golang的相关知识,请关注公众号!