如何将iter.Seq从一种元素类型映射为另一种元素类型?
Go泛型Seq类型的Map函数返回值问题
无法返回原输入序列类型SV的原因
你的Seq[V]接口定义的是底层为~func(yield func(V) bool)的类型,输入参数SV是Seq[V]的实现,对应处理V类型元素。而Map操作后产出U类型元素,对应的序列类型应为Seq[U](底层为func(yield func(U) bool))。由于func(yield func(V) bool)和func(yield func(U) bool)是完全不同的函数签名,Go不允许跨类型的隐式转换,所以不可能返回原类型SV——它的签名无法适配新的元素类型U。当前实现的合理性与优化方向
当前返回func(yield func(U) bool)的实现是可行的,因为它本质上就是Seq[U]的底层类型,调用方可以直接将其赋值给Seq[U]类型变量使用。如果追求接口一致性,可以将返回值显式声明为Seq[U],代码更清晰:func Map[V, U any, SV Seq[V]](s SV, mapFn func(V) U) Seq[U] { return func(yield func(U) bool) { for item := range s { if !yield(mapFn(item)) { return } } } }这种实现同样是零开销的,匿名函数直接满足
Seq[U]的接口要求,和Filter的设计风格统一,是更优的写法。总结
不存在“捕获输入序列类型并针对新元素类型返回该类型”的方法,因为原类型的函数签名和新元素类型不兼容。当前实现的核心逻辑是合理的,优化后返回Seq[U]接口类型会让代码更符合接口设计的一致性。
内容的提问来源于stack exchange,提问作者richardpj
相关产品推荐
相关产品推荐

