Wyobraźmy sobie następujący kod:Czy zebrane śmieci są zbierane razem z kanałami?
func waitForOneOfTwoProcesses() {
c := make(chan bool)
go func() {
time.Sleep(1 * time.Second)
c<-true
}()
go func() {
time.Sleep(2 * time.Second)
c<-true
}()
<-c
}
Czy ten wyciek kanał i goroutine lub wykracza uznają, że c
zniknął i goroutine może wyjść?
Czy odpowiedź byłaby inna, gdyby kanał miał rozmiar bufora 2?
Tak więc zapis do bloków kanałów, nawet jeśli kanał jest poza zakresem i nie można go odczytać od nowa. Zastanawiam się, czy to błąd czy funkcja. – AndreKR
Tak, wysyłanie zostanie zablokowane, nawet jeśli nie ma odbiornika. Środowisko wykonawcze można zapisać, aby wykryć, kiedy aplikacja odbierze kanał w tym konkretnym przykładzie, ale nie jest to coś, co środowisko wykonawcze może wykryć w ogóle. –
Jako uwaga, dostępny jest również "blokujący wysyłanie", który rozwiązuje ten dokładny problem - ustawiasz bufor na kanale na 1, a każdy będzie wysyłać bez blokowania. Opisano bardziej szczegółowo tutaj: https://blog.golang.org/go-concurrency-patterns-timing-out-and –