REBAJA de primavera
Iterator

Iterator en Go

Iterator es un patrón de diseño de comportamiento que permite el recorrido secuencial por una estructura de datos compleja sin exponer sus detalles internos.

Gracias al patrón Iterator, los clientes pueden recorrer elementos de colecciones diferentes de un modo similar, utilizando una única interfaz iteradora.

Ejemplo conceptual

La idea principal del patrón Iterator es extraer la lógica de iteración de una colección e introducirla en un objeto diferente llamado iterador. Este iterador proporciona un método genérico de iteración sobre una colección independiente de su tipo.

collection.go: Colección

package main

type Collection interface {
	createIterator() Iterator
}

userCollection.go: Colección concreta

package main

type UserCollection struct {
	users []*User
}

func (u *UserCollection) createIterator() Iterator {
	return &UserIterator{
		users: u.users,
	}
}

iterator.go: Iterador

package main

type Iterator interface {
	hasNext() bool
	getNext() *User
}

userIterator.go: Iterador concreto

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: Código cliente

package main

type User struct {
	name string
	age  int
}

main.go: Código cliente

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: Resultado de la ejecución

User is &{name:a age:30}
User is &{name:b age:20}

Iterator en otros lenguajes

Iterator en C# Iterator en C++ Iterator en Java Iterator en PHP Iterator en Python Iterator en Ruby Iterator en Rust Iterator en Swift Iterator en TypeScript