随着Go 1.18 中添加泛型,现在是否可以提出 C# 的LINQ to Objects的等效项?
或者与 C# 泛型相比,Go 的泛型在原则上缺乏某些东西,这会使这变得困难或不可能?
例如,原始101 个 LINQ 示例中的第一个(“LowNumbers”)现在可以在 Go 中使用泛型实现,大致如下:
package main
import (
"fmt"
)
type collection[T comparable] []T
func (input collection[T]) where(pred func(T) bool) collection[T] {
result := collection[T]{}
for _, j := range input {
if pred(j) {
result = append(result, j)
}
}
return result
}
func main() {
numbers := collection[int]{5, 4, 1, 3, 9, 8, 6, 7, 2, 0}
lowNums := numbers.where(func(i int) bool { return i < 5 })
fmt.Println("Numbers < 5:")
fmt.Println(lowNums)
}
Run Code Online (Sandbox Code Playgroud)
是和不是。
您几乎可以使用链接的 API 来实现这一目标。这适用于许多标准 LINQ 方法,例如Skip
、Take
、Where
、First
等Last
。
不起作用的是当您需要切换到流/流中的另一个通用类型时。
Go 泛型不允许方法具有除定义它们的接口/结构之外的其他类型参数。例如,您不能拥有一个结构Foo[T any]
,然后再拥有一个方法。这对于诸如输入一种类型和输出另一种类型的Bar[O any]
方法是必需的。Select
但是,如果您不使用链接而只使用普通函数。那么你就可以获得非常接近的功能。
我已经在这里完成了: https: //github.com/asynkron/gofun
这是通过模拟协同例程的完全惰性可枚举实现。
这里不起作用的是Zip
需要同时枚举两个可枚举值的函数。(虽然有很多方法可以破解它。但没什么好看的)
归档时间: |
|
查看次数: |
3130 次 |
最近记录: |