轉到函數可以返回多個值:如何從多值返回函數中訪問各個值?
func f() (int, int) {
return 2, 3
}
有什麼辦法從這樣的多值訪問單個值返回除了分配功能,即假設有
func g(i int) {...}
是有更簡單寫下面兩行的方法?
_, i = f()
g(i)
轉到函數可以返回多個值:如何從多值返回函數中訪問各個值?
func f() (int, int) {
return 2, 3
}
有什麼辦法從這樣的多值訪問單個值返回除了分配功能,即假設有
func g(i int) {...}
是有更簡單寫下面兩行的方法?
_, i = f()
g(i)
我個人最喜歡的是g(f()[1])
但這也是不可能的。
標準庫使用的當前解決方案是編寫簡單的幫助程序函數,這些函數會刪除不需要的返回值。例如,看看template包。
很多函數返回(*Template, os.Error)
元組,但有一個名爲template.Must()
的幫助程序,如果錯誤不爲零,它將只返回一個*Template
併發生混亂。
或者,像func extract(index int, values ...interface{}) interface{}
這樣的通用幫助函數可能會有效。但是由於目前還不支持泛型,我不會寫這樣的東西。
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])
沒有簡單的方法。
一個可能的解決方案看起來例如像這樣:
g(f().1)
有像這樣一個在Go功能沒有語法支持。
使用匿名結構而不是多個返回值。
func f() (struct{i,j int}) {
return struct{i, j int}{2, 3}
}
func g(i int) { ... }
func main() {
g(f().j)
}
當然,這隻適用於你正在寫函數。雖然你可以用現有的包裝,如果你想。
我不知道你自己有什麼想法,這可以做得更簡單(在語言語法級別)? – kostix
如果''f''的簽名有一個命名的返回參數''func f(' )(x int,y int)''。 – Tobias