НОВОРІЧНИЙ РОЗПРОДАЖ!
Ітератор

Ітератор на 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

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

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