Iterator adalah behavioral design pattern yang memungkinkan melakukan sequential traversal melalui struktur data yang kompleks tanpa mengekspos detail internalnya.
Ide utama dari Iterator pattern adalah memisahkan logika iterasi menjadi object tersendiri yang akan menyediakan generic method untuk melakukan iterasi yang tidak tergantung pada tipe object.
Berikut contoh penerapan pattern iterator dalam golang.
package main
import "fmt"
//collection
type collection interface {
createIterator() iterator
}
//concrete collection
type userCollection struct {
users []*user
}
func (u *userCollection) createIterator() iterator {
return &userIterator{
users: u.users,
}
}
//iterator
type iterator interface {
hasNext() bool
getNext() *user
}
//concrete iterator
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
}
//client code
type user struct {
name string
age int
}
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)
}
}