Czy można zostawić otwarty kanał?

Czy można zostawić kanał Go otwarty na zawsze (nigdy nie zamykać kanału), jeśli nigdy nie sprawdzam jego stanu? Czy doprowadzi to do wycieków pamięci? Czy poniższy kod jest w porządku?

func (requestCh chan<- Request) GetResponse(data RequestData) Response {
    reply := make(chan Response)
    requestCh <- Request{data: data, replyCh: reply}
    return <-reply
}
 96
Author: peterSO, 2011-12-21

4 answers

Można zostawić kanał Go otwarty na zawsze i nigdy go nie zamykać. Gdy kanał nie jest już używany, będą zbierane śmieci.

Należy pamiętać, że zamknięcie kanału jest konieczne tylko wtedy, gdy odbiornik jest Szukam blisko. Zamknięcie kanału jest sygnałem sterującym na kanał wskazujący, że nie ma więcej danych.

Pytanie Projektowe: Zamknięcie Kanału

 126
Author: peterSO,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-01 04:40:42

Tak, jest ok, aby utrzymać kanał otwarty. Jako język programowania go Opis książki:

Nie musisz zamykać każdego kanału, gdy skończysz z nim. to konieczne jest tylko zamknięcie kanału, gdy ważne jest, aby powiedzieć odbieranie goroutines, że wszystkie dane zostały wysłane. kanał, który garbage collector określa jako nieosiągalny będzie miał swoje zasoby odzyskane bez względu na to, czy są zamknięte. (Nie myl tego z bliska operacja dla otwartych plików. Ważne jest, aby zadzwonić do Zamknij metodę na każdym pliku po jej zakończeniu.)

 14
Author: cizixs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-28 03:49:39

Tak, można zostawić kanał otwarty, a w rzeczywistości jest to typowe. Otwarty kanał nie stanowi odniesienia do obiektu kanału, a więc nie chroni go przed zbieraniem śmieci.

 1
Author: Sonia,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-21 17:46:59

Go to śmieci zbierane, więc tak naprawdę nie musisz niczego "uwolnić".

Istnieje możliwość zamykania kanałów, ale jest to najczęściej używane jako-close ( channel) - powiedz goroutine (lub programowi głównemu), że nic więcej nie zostanie wysłane na tym kanale.

 -2
Author: Łukasz Gruner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-21 17:19:53