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,没有额外建议。