Golang Range over Func

在Golang中,如何使用range over func来遍历自定义迭代器?我看到官方文档提到这个特性但不清楚具体实现方法,能否提供一个在自定义类型上实现这种迭代方式的代码示例?比如如何定义yieldMoveNext这类操作?

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
}

示例代码

  1. 遍历整数序列
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
}
  1. 遍历切片
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 表示迭代提前终止。
  • 性能:适用于惰性求值场景,避免一次性生成所有数据。

此功能简化了自定义迭代逻辑,使代码更清晰且易于维护。

回到顶部