2015-01-08 87 views
12

我正在玩Go,但我很難做出其他語言非常簡單的事情。Golang相當於Python的列表解析

我想重現類似的語法:

array = [a for a in anotherArray if (some condition)] 

什麼是優雅的方式來做到這一點進去嗎?我真的很想簡化我的代碼,特別是在數組上使用函數時。例如:

min = min(abs(a[i], b[j]) for i in range(n) 
          for j in range(i, n)) 

非常感謝

+3

我認爲你正在尋找的術語是Python列表'comprehension' –

+3

只需自己編寫循環。編程不會傷害。 – Volker

+0

@Volker爲什麼downvote?你沒有找到[GoGenerics討論總結](https://docs.google.com/document/d/1vrAy9gMpMoS3uaVphB32uVXX4pi-HnNjkMEgyAHX4N4/mobilebasic?pli=1)有趣嗎?該文件包含與您的評論類似的建議。 – VonC

回答

6

有趣的是,Rob Pike只是建議(18小時前)這確實有點庫filter你想要什麼:

for instance Choose()

// 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. 

Tested here

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」:

這些是通常的higher-order functionsmapreducefold),filterzip

個案
typesafe data transformatio NS:mapfoldzip

優點爲使用泛型
簡明的方式來表達數據轉換。

缺點爲使用泛型
最快解決方案需要考慮到當和爲了應用這些轉換,以及如何在每一步中產生的數據量。
初學者很難閱讀。

替代方案

使用for循環和往常一樣的語言構造

+1

我傾向於同意派克的自述文件 - 使用'for'。 Go可能永遠但現在確定,Go是一種支持直線代碼的命令式語言。不管有多少人願意,語言可能不會改變,使其他方法更容易,或多或少。包裝的要點是(在得到投訴後),如果你覺得你真的需要'反映'和'東西',而不是他認爲你應該這樣做,那麼你可以做這種事情。 – twotwotwo

+0

@twotwotwo是的,我想''爲'',再加上一些''生成''應該就夠了。 – VonC

+6

注意突出的「你不應該使用這個包。」在http://godoc.org/robpike.io/filter – twotwotwo

1

如果你正在尋找的確實是python list comprehension,那麼在AFAIK中就沒有這樣的語法等價。

要做到這一點的方法是創建一個函數,它需要一個切片和一個函數(來測試條件)並返回一個新的切片。

編輯: 看起來好像Go中已經有了這樣的功能。 cf VonC

+0

不在Go(只是GitHub上的一個普通庫),文檔建議您不要使用它;這只是一個實驗,表明如果你願意,你可以做到。 – twotwotwo