2011-11-23 128 views
2

轉到函數可以返回多個值:如何從多值返回函數中訪問各個值?

func f() (int, int) { 
    return 2, 3 
} 

有什麼辦法從這樣的多值訪問單個值返回除了分配功能,即假設有

func g(i int) {...} 

是有更簡單寫下面兩行的方法?

_, i = f() 
g(i) 
+0

我不知道你自己有什麼想法,這可以做得更簡單(在語言語法級別)? – kostix

+0

如果''f''的簽名有一個命名的返回參數''func f(' )(x int,y int)''。 – Tobias

回答

2

我個人最喜歡的是g(f()[1])但這也是不可能的。

標準庫使用的當前解決方案是編寫簡單的幫助程序函數,這些函數會刪除不需要的返回值。例如,看看template包。

很多函數返回(*Template, os.Error)元組,但有一個名爲template.Must()的幫助程序,如果錯誤不爲零,它將只返回一個*Template併發生混亂。

或者,像func extract(index int, values ...interface{}) interface{}這樣的通用幫助函數可能會有效。但是由於目前還不支持泛型,我不會寫這樣的東西。

-1
g(func(fst,snd int) int { return snd }(f())) 

或定義SND

func snd(x, y int) int { 
    return y 
} 
g(snd(f())) 

,或者如果函數返回陣列

func f() ([2]int) { 
    return [2]int{2, 3} 
} 
g(f()[1]) 
+0

你真的會說這簡單嗎? ;)(順便說一句,我相信如果我沒有弄錯,編譯器會抱怨fst沒有被使用。) – Tobias

+0

它可能不是一個簡單的,沒有嘗試的。但是,其他合適的方法不會這麼想。如果所有其他都是匿名函數並且還要定義snd。我嘗試一下,沉默編譯器。 – BLUEPIXY

0

沒有簡單的方法。

一個可能的解決方案看起來例如像這樣:

g(f().1) 

有像這樣一個在Go功能沒有語法支持。

0

使用匿名結構而不是多個返回值。

func f() (struct{i,j int}) { 
    return struct{i, j int}{2, 3} 
} 

func g(i int) { ... } 

func main() { 
    g(f().j) 
} 

當然,這隻適用於你正在寫函數。雖然你可以用現有的包裝,如果你想。