ホームページ > バックエンド開発 > Golang > for ループで defer を呼び出す - チャネルからの応答の読み取りを遅らせるより良い方法はありますか?

for ループで defer を呼び出す - チャネルからの応答の読み取りを遅らせるより良い方法はありますか?

王林
リリース: 2024-02-09 12:15:22
転載
1236 人が閲覧しました

在 for 循环中调用 defer - 是否有更好的方法来延迟从通道读取响应?

for ループで defer を呼び出す - チャネルからの応答の読み取りを遅らせるより良い方法はありますか?これは、Go 言語を使用するときに多くの開発者が遭遇する一般的な問題です。 defer キーワードは、Go 言語で関数の実行を遅らせるために使用されます。for ループで defer を使用すると、各ループの終了後に特定の操作が確実に実行されます。ただし、ループごとにチャネルから応答を読み取る必要がある場合は、defer の使用が最良の選択ではない可能性があります。では、チャネルからの応答の読み取りを遅らせるより良い方法はあるのでしょうか?一緒に調べてみましょう。

質問内容

ループ内でチャンネルを返す関数を呼び出そうとしています。次に、チャネルはスライス channelslice に接続されます。最後に、チャネル スライスを反復処理し、各チャネルの応答を出力します。これを実行すると、IDE に警告が表示されます:

リーリー

ご覧のとおり、2 番目の for ループ内で close(channelslice[i]) を呼び出しています。これはお勧めできませんか?また、これがどのようにしてリソース リークを引き起こす可能性があるのでしょうか?チャネルを閉じるかスライスするより良い方法はありますか?

possible resource leak, 'defer' is called in the 'for' loop
ログイン後にコピー

解決策

@mkopriva が指摘したように、

遅延呼び出しは周囲の関数が終了するときに実行され、周囲の非機能ブロックが終了するときには呼び出されません。ループ本体をクロージャにカプセル化します。

これが私がやったことです:

リーリー

ご覧のとおり、defer ステートメントを iife (即時に呼び出される関数式) でラップしました。締め切りにするのもいいですね。

これにより、チャネルが閉じられ、メモリ リークが発生しなくなります。

以上がfor ループで defer を呼び出す - チャネルからの応答の読み取りを遅らせるより良い方法はありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:stackoverflow.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート