Czy mogę zostawić kanał Go otwarty na zawsze (nigdy nie zamykać kanału), jeśli nigdy nie sprawdzę jego stanu? Czy doprowadzi to do wycieków pamięci? Czy poniższy kod jest prawidłowy?
func (requestCh chan<- Request) GetResponse(data RequestData) Response {
reply := make(chan Response)
requestCh <- Request{data: data, replyCh: reply}
return <-reply
}
gc
i autorgccgo
powiedzmy kanałówclose
nie są potrzebni, chyba że szukasz plikuclose
. To miarodajna rada.Tak, otwarcie kanału jest w porządku. Jak stwierdzono w książce o języku programowania go :
źródło
Tak, pozostawienie otwartego kanału jest w porządku i jest to typowe. Otwarty kanał nie stanowi odwołania do obiektu kanału, a więc nie chroni go przed wyrzucaniem elementów bezużytecznych.
źródło
„ Ogólna zasada korzystania z kanałów Go polega na tym, że nie zamykaj kanału od strony odbiornika i nie zamykaj kanału, jeśli kanał ma wielu współbieżnych nadawców. ”.
Jak wyraźnie wspomniano w powyższej odpowiedzi, każdy kanał zostanie ostatecznie poddany GC, gdy zostanie oznaczony do czyszczenia, więc można pozostawić kanał niezamknięty, jedyną różnicą, jaką spowoduje, jest to, że kanał ten będzie dostępny dla
gc
po kilku cyklach, jeśli nie zamknięte jawnie.Również poniższe artykuły to i to pokazują różne sposoby zamykania kanału w przypadku 1: N, N: 1 lub M: N (nadawcy: odbiorcy)
źródło
Go jest zbierane jako śmieci, więc tak naprawdę nie musisz niczego „uwalniać”.
Istnieje możliwość zamknięcia kanałów, ale najczęściej jest to używane jako - zamknij (kanał) - mówi goroutine (lub programowi głównemu), że nic więcej nie zostanie wysłane na tym kanale.
źródło