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中文网其他相关文章!