Go 如何从多值返回函数中访问单个值?
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]
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)
。