我正在玩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))
非常感谢
答案 0 :(得分:10)
有趣的是,Rob Pike刚刚提出(18小时前)图书馆filter,它有点像你想要的那样:
// 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
指出in the comments,GoDoc for this library州:
包
filter
包含实用程序函数,用于通过过滤函数的分布式应用程序过滤切片。该软件包是一个实验,看看在Go中编写这样的东西是多么容易。这很简单,但
for
循环同样简单,效率更高。您不应该使用此软件包。
此警告反映在文档" Summary of Go Generics Discussions"," Functional Code":
通常为
map
,例如reduce
,fold
(filter
),zip
,map
等。<强>例强>:
类型安全数据转换:fold
,zip
,for
使用泛型的优点:
表达数据转换的简洁方法。使用泛型的缺点:
最快的解决方案需要考虑应用这些转换的时间和顺序,以及每个步骤生成的数据量 初学者更难阅读。替代解决方案:
使用{{1}}循环和通常的语言结构。
答案 1 :(得分:1)
如果您正在寻找的确是python列表理解,那么在AFAIK中就没有这样的句法等价物。
这样做的方法是创建一个带切片和函数的函数(测试条件)并返回一个新切片。
编辑: 看起来Go中已经有这样的功能了。 cf VonC