迭代器
顺序访问元素而不暴露容器细节。
行为型
说明
自定义集合可提供 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)
}
}继续阅读
- 设计意图与对象责任
- 设计意图与对象责任
- 设计意图与对象责任