转到函数可以返回多个值:如何从多值返回函数中访问各个值?
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