迭代器(Iterator)模式是一种行为型模式。在这种模式中,集合结构会提供一个迭代器。通过这个迭代器可以顺序遍历集合中的每个元素而不需要暴露其具体的实现。
示例代码:
package main
import (
"fmt"
)
// Iterator 接口: 这个接口会定义一些基础的操作函数,如hasNext()或getNext()等。通过名称就可以看出,这些方法可以帮助我们执行遍历集合、重启迭代等操作。
type Iterator interface {
hasNext() bool
getNext() *User
}
// Collection 接口: 这个接口代表了要被遍历的集合。在这个接口里定义了一个createIterator方法,该方法会返回一个Iterator的实例。
type Collection interface {
createIterator() Iterator
}
// 用户
type User struct {
name string
age int
}
// 用户迭代器,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
}
// 用户集合,Collection 接口具体实现
type UserCollection struct {
users []*User
}
func (u *UserCollection) createIterator() Iterator {
return &UserIterator{
users: u.users,
}
}
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}