[英]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.