ホームページ  >  記事  >  バックエンド開発  >  ここでパニックが起こる可能性はありますか?

ここでパニックが起こる可能性はありますか?

WBOY
WBOY転載
2024-02-05 21:36:111139ブラウズ

ここでパニックが起こる可能性はありますか?

質問内容

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 サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。