2011-11-23 127 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) 
} 

当然,这只适用于你正在写函数。虽然你可以用现有的包装,如果你想。