コードあります:ゴラン。パニックタイプ
func (c *Connector) SendPacketFuture(p []byte) (future chan []byte) {
defer func() {
// TODO Check r to catch only chan panics
if r := recover(); r != nil {
future = nil
}
}()
t := newConnectorTask(p)
c.tasks <- t
future = t.PacketFromServerChan
return
}
TODO
はかなり自明です。 c.tasks
はチャネルであり、別のゴルーチンによって閉じられます。閉鎖できるチャンネルに安全に送る方法はないので、私はここでパニックを起こしています。問題はさまざまなパニックが発生する可能性があることです。閉鎖されたchanに書き込むことによって引き起こされるものに反応したい。
Goでこれを行うことはできますか?
一般的に、これを検出しようとするべきではありません。また、プログラムを設計する別の方法があります。プログラムがクラッシュする恐れがある理由があります。 – JimB
TTLキャッシュを中心に構築されています。まれな競合状態です。コネクタを使用して未来を作成しようとしたときに、期限切れになってキャッシュから削除されました。私はSharedMutexを追加して物事を同期することができますが、これは_Potential_RCを解決しながら一定のランタイムコストを追加するだけです。パニックに対処することは合理的なハックだと思われる –
しかし、なぜチャネルは閉じられていますか?クローズは、送信者(通常)が送信する信号であり、したがって、チャネルが閉じられるとパニックが発生します。 – JimB