Go通过接口和闭包实现Iterator模式,解耦遍历逻辑与数据结构。1. 定义包含Next、Value、HasNext方法的Iterator接口,为具体类型如[]int实现;2. 使用工厂函数创建迭代器,统一遍历方式;3. 用闭包简化实现,适合简单场景;4. 借助泛型提升类型安全性。该模式增强代码可读性与复用性。

在Go语言中,虽然没有像C++或Java那样直接支持迭代器模式的语法结构,但通过接口(interface)和闭包等特性,可以非常自然地实现Iterator模式。这种方式能有效解耦集合的遍历逻辑与数据结构本身,提升代码的可读性和复用性。
1. Go中Iterator模式的基本结构
一个典型的迭代器包含两个核心方法:
- Next():移动到下一个元素
- Value() bool:获取当前元素的值
- HasNext() bool:判断是否还有下一个元素
以遍历一个整型切片为例,可以定义如下接口:
type Iterator interface {
Next()
Value() interface{}
HasNext() bool
}
接着为具体的集合类型实现该接口。比如对[]int实现迭代器:
立即学习“go语言免费学习笔记(深入)”;
type IntSliceIterator struct {
slice []int
index int
}
func (it *IntSliceIterator) Next() {
if it.HasNext() {
it.index++
}
}
func (it *IntSliceIterator) Value() interface{} {
return it.slice[it.index]
}
func (it *IntSliceIterator) HasNext() bool {
return it.index < len(it.slice)-1
}
// 工厂函数创建迭代器
func NewIntSliceIterator(slice []int) *IntSliceIterator {
return &IntSliceIterator{slice: slice, index: -1}
}
2. 使用迭代器遍历集合
有了上述实现后,就可以用统一方式遍历集合:
data := []int{10, 20, 30}
it := NewIntSliceIterator(data)
for it.HasNext() {
it.Next()
fmt.Println(it.Value())
}
输出结果为:
1020
30
这种方式将遍历控制权交给调用者,同时隐藏了底层数据结构的细节。
3. 使用闭包简化迭代器实现
Go语言支持闭包,也可以用更简洁的方式模拟迭代器行为:
func NewIntGenerator(slice []int) func() (int, bool) {
index := 0
return func() (int, bool) {
if index >= len(slice) {
return 0, false
}
v := slice[index]
index++
return v, true
}
}
使用方式如下:
next := NewIntGenerator([]int{5, 15, 25})
for {
if v, ok := next(); ok {
fmt.Println(v)
} else {
break
}
}
这种写法更轻量,适合简单场景,但不如接口方式灵活和可扩展。
4. 扩展支持多种数据类型
为了支持字符串、结构体等不同类型,可以让迭代器返回interface{},或者使用泛型(Go 1.18+):
type Iterator[T any] interface {
Next()
Value() T
HasNext() bool
}
泛型版本的实现更加类型安全,避免运行时类型断言错误。
基本上就这些。Go通过接口和函数式编程特性,能灵活实现Iterator模式,既保持简洁又具备良好的扩展能力。










