Autumn SALE
Itérateur

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}

Itérateur dans les autres langues

Itérateur en C# Itérateur en C++ Itérateur en Java Itérateur en PHP Itérateur en Python Itérateur en Ruby Itérateur en Rust Itérateur en Swift Itérateur en TypeScript