1
私は2つのio.ReadWriter
の間でメッセージを転送するために使用される関数を持っています。エラーが発生すると、エラーをログに記録してリターンする必要があります。しかし、私は私のコードでゴルーチン漏れの問題を抱えているかもしれないと思う:2つの入力を持つ出力を1つしか持たないバッファを1つ持つチャンネルで、ゴルーチン漏れが起こりますか?
func transport(rw1, rw2 io.ReadWriter) error {
errc := make(chan error, 1) // only one buffer
go func() {
_, err := io.Copy(rw1, rw2)
errc <- err
}()
go func() {
_, err := io.Copy(rw2, rw1)
errc <- err
}()
err := <-errc // only one error catched
if err != nil && err == io.EOF {
err = nil
}
return err
}
唯一つのエラーがこの機能に巻き込まれる可能があるので、二ゴルーチンの終了し、通常化け?または別のエラーを受け取るためにもう一度err <- errc
と書いてください。
おかげで、スリーズ:
コードは、単一のゴルーチンを使用するように簡略化することができます。 'errc'が2回設定されるようにサイズ2のチャンネルを設定すればもう1つの質問がありますが、' funcトランスポート 'は一度だけ読み込んで終了します。 – vinllen
はい、容量2のチャンネルを使用してリークを防ぐことができます。 –
ありがとうございます!それは私を助ける – vinllen