You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 21:42:33