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

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

WBOY
リリース: 2024-02-05 21:36:11
転載
1163 人が閲覧しました

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

質問内容

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 までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート