[英]Golang equivalent for Python's list comprehension
我正在玩Go,但我很难做其他语言非常简单的事情。
我想重现一个类似的语法:
array = [a for a in anotherArray if (some condition)]
Go的优雅方式是什么? 我真的很想简化我的代码,尤其是在使用数组上的函数时。 例如:
min = min(abs(a[i], b[j]) for i in range(n)
for j in range(i, n))
非常感谢
有趣的是, Rob Pike刚刚提出(18小时前)库过滤器 ,它可以满足您的需求:
参见例如选择()
// Choose takes a slice of type []T and a function of type func(T) bool. (If
// the input conditions are not satisfied, Choose panics.) It returns a newly
// allocated slice containing only those elements of the input slice that
// satisfy the function.
在这里测试 :
func TestChoose(t *testing.T) {
a := []int{1, 2, 3, 4, 5, 6, 7, 8, 9}
expect := []int{2, 4, 6, 8}
result := Choose(a, isEven)
正如twotwotwo
在评论中指出的那样,该库的GoDoc指出:
包
filter
包含实用程序功能,用于通过过滤功能的分布式应用程序过滤切片。该软件包是一个实验,看看在Go中编写这样的东西是多么容易。 这很容易,但是
for
循环来说同样简单且高效 。你不应该使用这个包。
这个警告反映在文档“ Go Generics Discussions ”中,“ 功能代码 ”部分:
这些是通常的高阶函数 ,如
map
,reduce
(fold
),filter
,zip
等。案例 :
类型安全数据转换:map
,fold
,zip
使用泛型的优点 :
表达数据转换的简洁方法。使用泛型的缺点 :
最快的解决方案需要考虑应用这些转换的时间和顺序,以及每个步骤生成的数据量。
初学者更难阅读。替代方案 :
for
循环和通常的语言结构 。
如果您正在寻找的确是python列表理解,那么在AFAIK中就没有这样的语法等价物。
这样做的方法是创建一个函数,该函数采用切片和函数(以测试条件)并返回一个新切片。
编辑:看起来Go中已经有这样的功能了。 cf VonC
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.