Rozważmy następujący kod jako uproszczonego przykładu:Czy odśmiecacz będzie zbierać procedury Go, które nigdy nie będą kontynuowane?
func printer(c <-chan int) {
for {
fmt.Print(<-c)
}
}
func provide() {
c := make(chan int)
go printer(c)
for i := 1; i <= 100; i++ {
c <- i
}
}
Funkcja provide
tworzy przejść rutynowe printer
która drukuje dane provide
generuje.
Moje pytanie brzmi, co stanie się po powrocie do provide
i rozpocznie blokowanie na pustym kanale. Czy rutynowa procedura zostanie przerwana, ponieważ nie ma już odniesienia do c
lub czy moduł do zbierania śmieci wyłapie tę sprawę i wyrzuci zarówno procedurę rutyny, jak i c
?
Jeśli rzeczywiście jest tak, że ten rodzaj kodu powoduje wyciek pamięci, jakie strategie mogę zrobić, aby zapobiec takiemu wyciekowi pamięci?
Dziękuję. Najwyraźniej moje "rozwiązanie" tak naprawdę nie działa dobrze. – fuz
przy użyciu klauzuli zakresu w drukarce goroutine uniknie się sprawdzenia ok -> dla v: = zakresu c {fmt.Println (v)} – Philipp
@Philipp: Tak, masz rację. – zzzz