Attenzione: Come deft_code menziona, questo codice perde un canale e un goroutine quando le interruzioni del ciclo. Non usare questo come modello generale.
In movimento, non c'è modo di fare un tipo arbitrario compatibile per range
, come range
supporta solo fette, array, canali e mappe.
È possibile scorrere i canali utilizzando range
, che è utile se si desidera eseguire un'iterazione su dati generati dinamicamente senza dover utilizzare una slice o una matrice.
Ad esempio:
func Iter() chan *Friend {
c := make(chan *Friend)
go func() {
for i:=0; i < 10; i++ {
c <- newFriend()
}
close(c)
}()
return c
}
func main() {
// Iterate
for friend := range Iter() {
fmt.Println("A friend:", friend)
}
}
Questa è la cosa più vicina si può avere a fare qualcosa 'RANGEABLE'.
Quindi una pratica comune è definire un metodo Iter()
o qualcosa di simile sul proprio tipo e passarlo a range
.
Vedere the spec per ulteriori informazioni su range
.
Potresti indicare un caso d'uso del mondo reale per questo? cioè, perché vuoi questo invece di 'range Friends.friends' o' range Friends.List() '(solo esempio)? –
Esempio: dopo si aggiorna la lista a un elenco di famiglie (gruppi di amici) e non si desidera modificare il codice client esistente che funziona perfettamente bene iterando su singoli amici. – Stein