Hura! Mamy wreszcie przyjemność udostępnić wam polską wersję! Zapraszamy do przesyłania wiadomości z waszymi uwagami i informacjami o zauważonych błędach.
Iterator

Iterator w języku Go

Iterator to behawioralny wzorzec projektowy pozwalający sekwencyjnie przechodzić od elementu do elementu jakiegoś zbioru bez konieczności eksponowania jego formy.

Dzięki Iteratorowi klienci mogą przeglądać kolejne elementy różnych kolekcji w podobny sposób, za pośrednictwem jednego interfejsu.

Przykład koncepcyjny

Główną ideą kryjącą się za wzorcem Iterator jest ekstrakcja logiki przechodzenia przez kolejne elementy jakiejś kolekcji do osobnego obiektu zwanego iteratorem. Iterator udostępnia generyczną metodę służącą przechodzeniu przez elementy kolekcji obiektów niezależnie od ich typu.

collection.go: Kolekcja

package main

type collection interface {
	createIterator() iterator
}

userCollection.go: Konkretna kolekcja

package main

type userCollection struct {
	users []*user
}

func (u *userCollection) createIterator() iterator {
	return &userIterator{
		users: u.users,
	}
}

iterator.go: Iterator

package main

type iterator interface {
	hasNext() bool
	getNext() *user
}

userIterator.go: Konkretny iterator

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: Kod klienta

package main

type user struct {
	name string
	age  int
}

main.go: Kod klienta

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: Wynik działania

User is &{name:a age:30}
User is &{name:b age:20}
Na podstawie: Golang By Example

Iterator w innych językach

Wzorce projektowe: Iterator w języku Java Wzorce projektowe: Iterator w języku C# Wzorce projektowe: Iterator w języku C++ Wzorce projektowe: Iterator w języku PHP Wzorce projektowe: Iterator w języku Python Wzorce projektowe: Iterator w języku Ruby Wzorce projektowe: Iterator w języku Swift Wzorce projektowe: Iterator w języku TypeScript