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

Go 如何从多值返回函数中访问单个值?,go,Go,Go函数可以返回多个值: func f() (int, int) { return 2, 3 } 除了赋值之外,是否有任何方法可以从这种多值返回函数中访问单个值,即假设有 func g(i int) {...} 有没有更简单的方法来写下面两行 _, i = f() g(i) 或定义snd func snd(x, y int) int { return y } g(snd(f())) 或者如果函数返回数组 func f() ([2]int) { return [2]

Go函数可以返回多个值:

func f() (int, int) {
    return 2, 3
}
除了赋值之外,是否有任何方法可以从这种多值返回函数中访问单个值,即假设有

func g(i int) {...}
有没有更简单的方法来写下面两行

_, i = f()
g(i)
或定义snd

func snd(x, y int) int {
    return y
}
g(snd(f()))
或者如果函数返回数组

func f() ([2]int) {
    return [2]int{2, 3}
}
g(f()[1])
或定义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中的这种功能没有语法支持。

没有更简单的方法

可能的解决方案如下所示:

g(f().1)

在Go中,这种功能没有语法支持。

我个人最喜欢的是
g(f()[1])
,但这也不可能

标准库当前使用的解决方案是编写简单的helper函数,这些函数会删除不需要的返回值。例如,看看这个包

那里的很多函数都返回一个
(*Template,os.Error)
元组,但是有一个名为
Template.Must()
的助手,它只返回一个
*模板
,如果错误不是零,它就会惊慌失措


或者,像
func extract(index int,values…interface{})interface{}
这样的一般辅助函数可能会起作用。但是由于还没有对泛型的支持,我不会写这样的东西。

我个人最喜欢的是
g(f()[1])
,但这也不可能

标准库当前使用的解决方案是编写简单的helper函数,这些函数会删除不需要的返回值。例如,看看这个包

那里的很多函数都返回一个
(*Template,os.Error)
元组,但是有一个名为
Template.Must()
的助手,它只返回一个
*模板
,如果错误不是零,它就会惊慌失措


或者,像
func extract(index int,values…interface{})interface{}
这样的一般辅助函数可能会起作用。但是由于还不支持泛型,我不会写这样的东西。

使用匿名结构而不是多个返回值

func f() (struct{i,j int}) {
    return struct{i, j int}{2, 3}
}

func g(i int) { ... }

func main() {
    g(f().j)
}

当然,这仅在编写函数时有效。不过,如果需要,可以用它包装现有的结构。

使用匿名结构而不是多个返回值

func f() (struct{i,j int}) {
    return struct{i, j int}{2, 3}
}

func g(i int) { ... }

func main() {
    g(f().j)
}

当然,这仅在编写函数时有效。不过,如果您愿意,您可以用它来包装现有的文件。

您真的认为这更简单吗?;)(顺便说一句,如果我没有弄错的话,我相信编译器会抱怨fst未被使用。)这可能不是一个简单的、没有尝试的方法。但是,其他合适的方法不会这么认为。如果所有其他都是匿名函数,也可以定义snd。我试过了,让编译器静音。你真的认为这更简单吗?;)(顺便说一句,如果我没有弄错的话,我相信编译器会抱怨fst未被使用。)这可能不是一个简单的、没有尝试的方法。但是,其他合适的方法不会这么认为。如果所有其他都是匿名函数,也可以定义snd。我试了一下,让编译器安静下来。我想知道你自己是否知道如何简化(在语言语法层面上)?我最喜欢的是
g(f()[1])
g(f().y)
如果
f
的签名有一个命名的返回参数
func f()(x int,y int)
。我想知道你自己是否知道如何简化(在语言语法层面上)?我最喜欢的是
g(f()[1])
g(f().y)
如果
f
的签名有一个命名的返回参数
func f()(x int,y int)