Потрібна крута книжка про патерни та ще й українською? Ось вона »
Ітератор

Ітератор на Go

Ітератор — це поведінковий патерн, що дозволяє послідовно обходити складну колекцію, не розкриваючи деталі її реалізації.

Завдяки Ітераторові, клієнт може обходити різні колекції в один і той же спосіб, використовуючи єдиний інтерфейс ітераторів.

Концептуальний приклад

Суть патерна Ітератор — вивести логіку послідовного проходження колекції в окремий об’єкт під назвою «ітератор». Цей ітератор надає універсальні методи для послідовного проходження колекції незалежно від її типу.

collection.go: Колекція

package main

type collection interface {
	createIterator() iterator
}

userCollection.go: Конкретна колекція

package main

type userCollection struct {
	users []*user
}

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

iterator.go: Ітератор

package main

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

userIterator.go: Конкретний ітератор

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: Клієнтський код

package main

type user struct {
	name string
	age  int
}

main.go: Клієнтський код

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: Результат виконання

User is &{name:a age:30}
User is &{name:b age:20}
На основі: Golang By Example

Ітератор іншими мовами програмування

Ітератор на Java Ітератор на C# Ітератор на C++ Ітератор на PHP Ітератор на Python Ітератор на Ruby Ітератор на Swift Ітератор на TypeScript