Ist es in Ordnung, einen Go-Kanal für immer offen zu lassen (niemals den Kanal schließen), wenn ich nie nach seinem Status überprüfe? Wird es zu Speicherlecks führen? Ist der folgende Code in Ordnung?
func (requestCh chan<- Request) GetResponse(data RequestData) Response {
reply := make(chan Response)
requestCh <- Request{data: data, replyCh: reply}
return <-reply
}
gc
und der Autor vongccgo
say channelclose
s sind nicht erforderlich, es sei denn, Sie suchen nach einemclose
. Das ist ein maßgeblicher Rat.Ja, es ist in Ordnung, einen Kanal offen zu halten. In dem Programmiersprachenbuch go heißt es:
quelle
Ja, es ist in Ordnung, den Kanal offen zu lassen, und tatsächlich ist es typisch. Ein offener Kanal stellt keinen Verweis auf das Kanalobjekt dar und verhindert daher nicht, dass Müll gesammelt wird.
quelle
" Ein allgemeines Prinzip bei der Verwendung von Go-Kanälen besteht darin, einen Kanal nicht von der Empfängerseite aus zu schließen und keinen Kanal zu schließen, wenn der Kanal mehrere gleichzeitige Sender hat. "
Wie in der obigen Antwort klar erwähnt, wird jeder Kanal irgendwann GCed, sobald er zur Bereinigung markiert ist. Es ist also in Ordnung, den Kanal nicht geschlossen zu lassen. Der einzige Unterschied besteht darin, dass dieser Kanal möglicherweise
gc
nach einigen Zyklen verfügbar ist, wenn nicht explizit geschlossen.Auch die folgenden Artikel dies und das zeigen verschiedene Möglichkeiten, einen Kanal im Fall von 1: N, N: 1 oder M: N zu schließen (Sender: Empfänger)
quelle
Go ist Müll gesammelt, so dass Sie nichts wirklich "befreien" müssen.
Es besteht die Möglichkeit, Kanäle zu schließen, aber es wird meistens verwendet, um - der (Kanal) - der Goroutine (oder dem Hauptprogramm) mitzuteilen, dass auf diesem Kanal nichts anderes gesendet wird.
quelle