¡Hurra! ¡La versión en español se lanzó por fin! Por favor, envíanos un mensaje si quieres compartir tu opinión o reportar un error.
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

Patrones de diseño: Iterator en Java Patrones de diseño: Iterator en C# Patrones de diseño: Iterator en C++ Patrones de diseño: Iterator en PHP Patrones de diseño: Iterator en Python Patrones de diseño: Iterator en Ruby Patrones de diseño: Iterator en Swift Patrones de diseño: Iterator en TypeScript