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