Go 1.23中如何将iter.Seq2[int,E]转为iter.Seq[E]并配合slices.Collect?
在Go 1.23中将iter.Seq2转换为iter.Seq的方法
问题核心是slices.Backward返回的iter.Seq2[int, E]包含索引和元素两个值,而slices.Collect仅接受单元素的iter.Seq[E],需要通过适配器丢弃索引、保留元素来实现兼容。以下是几种可行方案:
1. 自定义适配器函数(可复用)
编写通用函数将任意iter.Seq2[K, V]转换为iter.Seq[V]:
import "iter" func Seq2ToSeq[K, V any](seq iter.Seq2[K, V]) iter.Seq[V] { return func(yield func(V) bool) { // 遍历Seq2,仅传递元素给yield函数 for _, v := range seq { if !yield(v) { return } } } }
使用示例:
import "slices" func main() { it := slices.Backward([]int{1, 2, 3}) result := slices.Collect(Seq2ToSeq(it)) // result 结果为 [3, 2, 1] }
2. 匿名函数直接包装(一次性场景)
无需额外定义函数,直接在Collect调用中构造iter.Seq:
import ( "iter" "slices" ) func main() { s := []int{1, 2, 3} result := slices.Collect(func(yield func(int) bool) { for _, v := range slices.Backward(s) { if !yield(v) { return } } }) }
3. 利用iter.Map转换(简洁写法)
借助iter.Map将Seq2的键值对转换为仅保留元素的Seq:
import ( "iter" "slices" ) func main() { result := slices.Collect(iter.Map(slices.Backward([]int{1, 2, 3}), func(_ int, v int) int { return v // 忽略索引,直接返回元素 })) }
原理说明
iter.Seq[E]本质是函数类型func(yield func(E) bool),上述方案都是通过构造该类型的函数,内部遍历Seq2并仅将元素传递给yield,从而实现类型兼容。
内容的提问来源于stack exchange,提问作者adel
相关产品推荐
相关产品推荐

