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 } } }
line2 と line3 の間に分岐 1 が発生するとパニックになる可能性はありますか。
はい、パニックになる可能性があります。以下は、パニックが発生するタイムラインの例です。行は時間の昇順に並べられます。 N: プレフィックスはゴルーチンを表します。
1: コルーチン 2
を開始します。
2: ctx.Err() を呼び出すと、nil
が返されます。
1: cancelFunc()
を呼び出す
1: チャンネル anis
を閉じる
2: 任意のチャネルに送信します。チャンネルが閉じられているのでパニックになります。
以上がここでパニックが起こる可能性はありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。