
Itérateur en Go
L’Itérateur est un patron de conception comportemental qui permet de parcourir une structure de données complexe de façon séquentielle sans exposer ses détails internes.
Grâce à l’itérateur, les clients peuvent parcourir les éléments de différentes collections de la même manière en utilisant une seule interface.
Exemple conceptuel
Le but du patron de conception itérateur est d’extraire la logique d’itération d’une collection et de la mettre dans un autre objet que l’on appelle un itérateur. Cet itérateur fournit une méthode générique pour parcourir une collection indépendamment de son type.
collection.go: Collection
package main type Collection interface { createIterator() Iterator }
userCollection.go: Collection concrète
package main type UserCollection struct { users []*User } func (u *UserCollection) createIterator() Iterator { return &UserIterator{ users: u.users, } }
iterator.go: Itérateur
package main type Iterator interface { hasNext() bool getNext() *User }
userIterator.go: Itérateur concret
package main type UserIterator struct { index int users []*User } func (u *UserIterator) hasNext() bool { if u.index < len(u.users) { return true } return false } func (u *UserIterator) getNext() *User { if u.hasNext() { user := u.users[u.index] u.index++ return user } return nil }
user.go: Code client
package main type User struct { name string age int }
main.go: Code client
package main import "fmt" func main() { user1 := &User{ name: "a", age: 30, } user2 := &User{ name: "b", age: 20, } userCollection := &UserCollection{ users: []*User{user1, user2}, } iterator := userCollection.createIterator() for iterator.hasNext() { user := iterator.getNext() fmt.Printf("User is %+v\n", user) } }
output.txt: Résultat de l’exécution
User is &{name:a age:30} User is &{name:b age:20}
Basé sur: Golang By Example