首页  >  文章  >  后端开发  >  如何在 Go 中实现与 Python 的列表理解等效的效果?

如何在 Go 中实现与 Python 的列表理解等效的效果?

Susan Sarandon
Susan Sarandon原创
2024-11-12 16:22:02418浏览

How to Achieve Python's List Comprehension Equivalent in Go?

Go 中 Python 列表理解的等效项

与 Python 等其他语言相比,许多开发人员发现在 Go 中执行看似简单的任务具有挑战性。其中一项任务是复制 Python 的列表理解语法。

要在 Go 中实现等效的构造,请考虑以下方法:

1。使用“filter”库:

根据 Rob Pike 的建议,“filter”库提供了一个名为 Choose() 的方法,该方法返回一个包含满足指定条件的元素的切片。例如:

import (
    "github.com/google/go-cmp/cmp"
    "go.opencensus.io/plugin/ochttp"
    "golang.org/x/exp/slices"
)

var (
    a = []int{1, 2, 3, 4, 5, 6, 7, 8, 9}
    b = []int{2, 4, 6, 8}
)

func TestChoose(t *testing.T) {
    result := ochttp.Choose(a, func(v int) bool { return v%2 == 0 })
    if !cmp.Equal(result, b) {
        t.Errorf("TestChoose() failed, got %v, want %v", result, b)
    }
}

2。使用 For 循环:

尽管有像“filter”这样的库,Go 的 for 循环仍然是一个有效的替代方案。 “过滤器”库的 GoDoc 明确建议在考虑效率时使用 for 循环。

3.使用 Go 泛型(Go 1.18 中出现):

随着 Go 中即将引入泛型,使用泛型实现 MapReduce 将成为可能。例如:

func MapReduce[T, V, R any](in <-chan T, out chan<- R, mapFn func(T) V, reduceFn func(V, V) R) {

    v := make(chan V, 10)
    defer close(v)

    go func() {
        for t := range in {
            v <- mapFn(t)
        }
    }()

    r := make(chan R, 10)
    defer close(r)

    go func() {
        var acc R
        for v := range v {
            acc = reduceFn(acc, v)
        }
        r <- acc
    }()

    return <-r
}

此实现接受 T 类型的通道,对每个元素应用映射函数,并将结果存储在 V 类型的通道中。另一个 goroutine 消耗映射值的通道并重复应用归约函数产生 R 类型的结果。然后结果作为 R 类型的通道返回。

结论:

虽然 Python 的列表理解语法提供作为一种简洁的数据转换方式,Go 提供了使用 for 循环或“filter”等库的有效替代方案。随着 Go 1.18 中泛型的引入,将提供更高效、更通用的数据转换机制。

以上是如何在 Go 中实现与 Python 的列表理解等效的效果?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn