Go 泛型是否允许 LINQ to Objects 等效项?

Max*_*Max 4 linq generics go

随着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)

Rog*_*son 8

是和不是。

几乎可以使用链接的 API 来实现这一目标。这适用于许多标准 LINQ 方法,例如SkipTakeWhereFirstLast

不起作用的是当您需要切换到流/流中的另一个通用类型时。

Go 泛型不允许方法具有除定义它们的接口/结构之外的其他类型参数。例如,您不能拥有一个结构Foo[T any],然后再拥有一个方法。这对于诸如输入一种类型和输出另一种类型的Bar[O any] 方法是必需的。Select

但是,如果您不使用链接而只使用普通函数。那么你就可以获得非常接近的功能。

我已经在这里完成了: https: //github.com/asynkron/gofun

这是通过模拟协同例程的完全惰性可枚举实现。

这里不起作用的是Zip需要同时枚举两个可枚举值的函数。(虽然有很多方法可以破解它。但没什么好看的)