Si consideri il seguente codice come un esempio semplificato:Il garbage collector raccoglierà le routine Go che non continueranno mai?
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
}
}
La funzione provide
crea un andare di routine printer
che stampa i dati provide
genera.
La mia domanda è, cosa succede dopo i ritorni provide
e printer
inizia il blocco sul canale vuoto. La routine di routine andrà persa, poiché non vi sono ulteriori riferimenti a c
o il garbage collector prenderà questo caso e disporrà sia la routine go che c
?
Se è davvero il caso che questo tipo di codice causi una perdita di memoria, quali strategie posso fare per evitare che si verifichi una tale perdita di memoria?
Grazie. Apparentemente la mia "soluzione" non ha funzionato bene. – fuz
utilizzando una clausola di intervallo nella goroutine della stampante eviterà il controllo ok -> per v: = intervallo c {fmt.Println (v)} – Philipp
@Philipp: Sì, hai ragione. – zzzz