当前位置: > > > > 这里可能会出现恐慌吗?
来源: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的相关知识,请关注公众号!