迭代器模式是一种行为型模式。在这种模式中,集合结构会提供一个迭代器。通过这个迭代器可以顺序遍历集合中的每个元素而不需要暴露其具体的实现。

下面是迭代器模式的一些具体实现:

hasNext()getNext()createIteratorIteratorIteratorCollection

在golang当前的版本(1.16或更早)中是没有泛型的,所以一些特殊情况下还是需要会用到迭代器模式。

来看下类图:

下面是示例代码:

iterator.go:

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

collection.go:

type collection interface {
	createIterator() iterator
}

user.go:

type user struct {
	name string
	age  int
}

userIterator.go:

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
}

userCollection.go:

type userCollection struct {
	users []*user
}

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

main.go:

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)
	}
}

输出内容:

User is &{name:a age:30}
User is &{name:b age:20}

END!