web-dev-qa-db-ja.com

チャンネルを開いたままにしても大丈夫ですか?

Goチャンネルの状態を確認したことがない場合、Goチャンネルを永久に開いたままにしておいても問題ありませんか?メモリリークが発生しますか?次のコードは大丈夫ですか?

func (requestCh chan<- Request) GetResponse(data RequestData) Response {
    reply := make(chan Response)
    requestCh <- Request{data: data, replyCh: reply}
    return <-reply
}
128
Kluyg

Goチャンネルを永久に開いたままにして、決して閉じないでかまいません。チャネルが使用されなくなると、ガベージコレクションが行われます。

レシーバーがクローズを探している場合にのみ、チャネルをクローズする必要があることに注意してください。チャネルを閉じることは、チャネル上の制御信号であり、これ以上データが続かないことを示します。

設計質問:チャンネル閉鎖

186
peterSO

はい、チャンネルを開いたままにしておいてかまいません。 goプログラミング言語 本の説明:

終了したら、すべてのチャネルを閉じる必要はありません。 すべてのデータが送信されたことを受信側のゴルーチンに伝えることが重要な場合にのみ、チャネルを閉じる必要があります。到達不能の場合、リソースが閉じられているかどうかに関係なく、そのリソースは回収されます。 (これを開いているファイルの閉じる操作と混同しないでください。すべてのファイルで終了したら、Closeメソッドを呼び出すことが重要です。)

23
cizixs

はい、チャンネルを開いたままにしておいてかまいません。実際、これは典型的なものです。開いているチャネルは、チャネルオブジェクトへの参照を構成しないため、ガベージコレクションから保護されません。

5
Sonia