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中文網其他相關文章!