Existe-t-il une implémentation d'itérateur idiomatique dans Go ?
Les canaux, qui rappellent les itérateurs, proposent une itération via le mot-clé range. Cependant, l’incapacité de sortir de ces boucles sans créer de fuites goroutines limite leur utilité. À la recherche d'un modèle d'itérateur plus idiomatique, les développeurs ont posé des questions sur la façon d'itérer de manière expressive et de combiner des itérateurs à l'aide d'opérateurs tels que mapper, filtrer et réduire.
Approche basée sur la fermeture
Malgré la maniabilité des canaux, les fermetures s'avèrent souvent plus adaptées. Les fermetures permettent la création d'itérateurs qui génèrent des valeurs de manière séquentielle. Voici un exemple de création d'un itérateur pour des nombres pairs à l'aide d'une fermeture :
func newEven() func() int { n := 0 return func() int { n += 2 return n } }
Approche basée sur la méthode
Si les fermetures ne vous conviennent pas, vous pouvez employer un type nommé avec une méthode :
type even int func (e *even) next() int { *e += 2 return int(*e) }
Compromis et Chaînage
Le choix entre les fermetures et les méthodes implique des compromis. Les fermetures sont plus flexibles, tandis que les méthodes fournissent une structure plus explicite.
Le chaînage est simple dans Go grâce à la nature de première classe des fonctions. L'exemple suivant montre comment chaîner un générateur de nombres pairs avec une fonction de mise au carré :
func mapInt(g intGen, f func(int) int) intGen { return func() int { return f(g()) } } func square(i int) int { return i * i }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!