如何从多值返回函数中访问单个值?

时间:2011-11-23 00:40:26

标签: go

Go函数可以返回多个值:

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

有没有办法从除了赋值之外的这种多值返回函数中访问单个值,即假设有

func g(i int) {...}

是否有更简单的方法来编写以下两行?

_, i = f()
g(i)

4 个答案:

答案 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中没有像这样的功能的语法支持。

相关问题