Go函数可以返回多个值:
func f() (int, int) {
return 2, 3
}
有没有办法从除了赋值之外的这种多值返回函数中访问单个值,即假设有
func g(i int) {...}
是否有更简单的方法来编写以下两行?
_, i = f()
g(i)
答案 0 :(得分:2)
我个人最喜欢的是g(f()[1])
,但这也不可能。
标准库使用的当前解决方案是编写简单的辅助函数,这些函数会丢弃不需要的返回值。例如,请查看template包。
那里有很多函数会返回一个(*Template, os.Error)
元组,但是有一个名为template.Must()
的帮助器只返回*Template
并且如果错误不是n则会发生恐慌。
或者,像func extract(index int, values ...interface{}) interface{}
这样的通用辅助函数可能会起作用。但由于还没有对泛型的支持,我不会写那样的东西。
答案 1 :(得分:0)
使用匿名结构而不是多个返回值。
func f() (struct{i,j int}) {
return struct{i, j int}{2, 3}
}
func g(i int) { ... }
func main() {
g(f().j)
}
当然这仅在您编写函数时有效。虽然如果你愿意,你可以用现有的包裹它。
答案 2 :(得分:-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])
答案 3 :(得分:-1)
没有更简单的方法。
可能的解决方案如下所示:
g(f().1)
Go中没有像这样的功能的语法支持。