![Iterator](/images/patterns/cards/iterator-mini.png?id=76c28bb48f997b36965983dd2b41f02e)
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}
Basado en: Golang By Example