Golang高效迭代工具:Ik iter.Seq使用指南

Golang高效迭代工具:Ik iter.Seq使用指南 随着 Go 1.23 的发布,我发布了一小组函数,它们可能帮助您更有效地使用 iter.Seq。请查看并告诉我您希望添加哪些功能!

GitHub - workspace-9/ik: Go iter kit

3 回复

这真是太棒了,它证明了 range-over-func 终究是个好主意。

更多关于Golang高效迭代工具:Ik iter.Seq使用指南的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


很高兴你觉得它很酷!

我认为 range-over 函数存在一些设计缺陷,主要是我并不确信 Push 迭代器比 Pull 迭代器更好,因为 Pull 风格似乎更贴近底层实际发生的情况(数据结构是由 for 循环要求的,而不是 for 循环由数据结构要求)。我很好奇它们的使用范围会有多广泛 微笑

ik 库为 Go 1.23 的 iter.Seq 提供了实用的扩展函数,确实能提升迭代代码的简洁性和表达力。以下是一些核心函数的使用示例:

1. ik.Filter - 过滤迭代元素

import "iter"
import "github.com/workspace-9/ik"

seq := ik.Filter(
    iter.Seq[int](func(yield func(int) bool) {
        for i := 0; i < 10; i++ {
            if !yield(i) { return }
        }
    }),
    func(i int) bool { return i%2 == 0 }, // 只保留偶数
)

for v := range seq {
    fmt.Println(v) // 输出: 0 2 4 6 8
}

2. ik.Map - 转换迭代元素

seq := ik.Map(
    ik.Range(0, 5), // 生成 0-4
    func(i int) string { return fmt.Sprintf("item-%d", i) },
)

for s := range seq {
    fmt.Println(s) // 输出: item-0 ... item-4
}

3. ik.Reduce - 归约计算

sum := ik.Reduce(
    ik.Range(1, 6), // 1-5
    0,
    func(acc, cur int) int { return acc + cur },
)
fmt.Println(sum) // 输出: 15

4. ik.Zip - 并行迭代多个序列

names := ik.FromSlice([]string{"Alice", "Bob", "Charlie"})
ages := ik.FromSlice([]int{25, 30, 35})

seq := ik.Zip(names, ages)
for pair := range seq {
    fmt.Printf("%s is %d years old\n", pair.V1, pair.V2)
}
// 输出:
// Alice is 25
// Bob is 30
// Charlie is 35

5. ik.Chunk - 分批处理

seq := ik.Chunk(ik.Range(0, 10), 3) // 每3个元素一批
for chunk := range seq {
    fmt.Println(chunk) // 输出: [0 1 2] [3 4 5] [6 7 8] [9]
}

6. ik.Flatten - 展平嵌套迭代

nested := ik.FromSlice([]iter.Seq[int]{
    ik.FromSlice([]int{1, 2}),
    ik.FromSlice([]int{3, 4, 5}),
})

seq := ik.Flatten(nested)
for v := range seq {
    fmt.Print(v) // 输出: 1 2 3 4 5
}

7. 链式组合示例

result := ik.Reduce(
    ik.Map(
        ik.Filter(
            ik.Range(1, 11),
            func(i int) bool { return i%2 == 0 },
        ),
        func(i int) int { return i * 2 },
    ),
    0,
    func(acc, cur int) int { return acc + cur },
)
fmt.Println(result) // 输出: 60 (2*2 + 4*2 + 6*2 + 8*2 + 10*2)

这些函数实现了常见的迭代器模式,让 iter.Seq 的使用更加符合函数式编程风格。代码直接使用了 ik 的现有 API,没有额外建议。

回到顶部