
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