Golang Range over Func
在Golang中,如何使用range over func来遍历自定义迭代器?我看到官方文档提到这个特性但不清楚具体实现方法,能否提供一个在自定义类型上实现这种迭代方式的代码示例?比如如何定义yield和MoveNext这类操作?
2 回复
Golang中,range可用于遍历函数返回的迭代器。例如,使用range遍历生成器函数,可逐个获取值。适用于处理流数据或无限序列,简洁高效。
更多关于Golang Range over Func的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
在 Go 1.22 版本中,引入了 Range over Func 功能,允许通过 range 关键字遍历函数生成的序列。这基于新的迭代器协议,使用 yield 关键字(类似生成器)来逐个返回值。
基本语法
for value := range func(yield func(T) bool) {
// 通过 yield 返回值
yield(value)
} {
// 处理每个 value
}
示例代码
- 遍历整数序列:
for i := range func(yield func(int) bool) {
for j := 0; j < 5; j++ {
if !yield(j) { // 如果 yield 返回 false,停止迭代
return
}
}
} {
fmt.Println(i) // 输出 0, 1, 2, 3, 4
}
- 遍历切片:
slice := []string{"a", "b", "c"}
for v := range func(yield func(string) bool) {
for _, s := range slice {
if !yield(s) {
return
}
}
} {
fmt.Println(v) // 输出 a, b, c
}
注意事项
- Go 版本:需使用 Go 1.22 或更高版本。
- yield 机制:
yield函数返回bool类型,若返回false表示迭代提前终止。 - 性能:适用于惰性求值场景,避免一次性生成所有数据。
此功能简化了自定义迭代逻辑,使代码更清晰且易于维护。

