Skip to content
← 返回设计模式列表
设计意图与对象责任

迭代器 ​

顺序访问元素而不暴露容器细节。

行为型

说明 ​

自定义集合可提供 Next 方法;普通 Go 切片通常直接 range 即可。

分析 ​

Iterator 自己保存当前索引,Next 每次返回一个值和是否成功的标记。调用方无需知道数据如何存储,也能逐项消费集合。

迭代位置属于 Iterator,而非元素本身:连续三次 Next 得到 10/true、20/true、0/false。不能用返回值为零判断结束,因为集合中可以有零。示例要求 Index 非负且遍历期间不修改集合;数据库游标等资源型迭代器还需区分结束与错误,并提供关闭方式。

查看图表代码

适用前提与边界 ​

对普通切片直接使用 range 更简单;自定义容器或惰性数据源才更需要独立迭代器。 交互流程很短且稳定时,直接调用通常更容易理解。

示例输入与调用 ​

go
it := Iterator{Values: []int{10, 20}}
	for {
		value, ok := it.Next()
		if !ok {
			break
		}
		fmt.Println(value)
	}

运行输出 ​

text
10
20

完整 Go 示例 ​

go
package main

import "fmt"

type Iterator struct {
	Values []int
	Index  int
}

func (it *Iterator) Next() (int, bool) {
	if it.Index >= len(it.Values) {
		return 0, false
	}
	value := it.Values[it.Index]
	it.Index++
	return value, true
}

func main() {
	it := Iterator{Values: []int{10, 20}}
	for {
		value, ok := it.Next()
		if !ok {
			break
		}
		fmt.Println(value)
	}
}

继续阅读