英文:
How to access individual values from a multi-value returning function?
问题
Go函数可以返回多个值:
func f() (int, int) {
return 2, 3
}
除了赋值之外,是否有其他方法可以从这样的多值返回函数中访问单个值,即假设有
func g(i int) {...}
是否有更简单的方法来编写以下两行代码?
_, i = f()
g(i)
英文:
Go functions can return multiple values:
func f() (int, int) {
return 2, 3
}
Is there any way to access individual values from such a multi-value returning function except assignment, i.e. suppose there is
func g(i int) {...}
is there is simpler way to write the following two lines?
_, i = f()
g(i)
答案1
得分: 2
我个人最喜欢的是g(f()[1])
,但这也不可能。
标准库目前使用的解决方案是编写简单的辅助函数,用于丢弃不需要的返回值。例如,看一下template包。
那里有很多函数返回一个(*Template, os.Error)
元组,但有一个名为template.Must()
的辅助函数,它只返回一个*Template
,如果错误不是nil,则会引发panic。
或者,一个通用的辅助函数,比如func extract(index int, values ...interface{}) interface{}
,可能会解决问题。但由于目前还不支持泛型,我不会写这样的东西。
英文:
My personal favorite would be g(f()[1])
but that's not possible either.
The current solution used by the standard library is to write simple helper functions which are dropping the unwanted return values. For example, take a look at the template package.
A lot of functions there return a (*Template, os.Error)
tuple, but there is a helper called template.Must()
which only returns a *Template
and panics if the error isn't nil.
Alternatively, a general helper function like func extract(index int, values ...interface{}) interface{}
might do the trick. But since there isn't support for generics yet, I wouldn't write something like that.
答案2
得分: 0
使用匿名结构体代替多个返回值。
func f() (struct{i,j int}) {
return struct{i, j int}{2, 3}
}
func g(i int) { ... }
func main() {
g(f().j)
}
当然,这只适用于你自己编写的函数。如果需要的话,你也可以用这种方式包装现有的函数。
英文:
Use an anonymous struct instead of multiple return values.
func f() (struct{i,j int}) {
return struct{i, j int}{2, 3}
}
func g(i int) { ... }
func main() {
g(f().j)
}
Of course this only works when you are writing the function. Though you can wrap existing ones with this if you want.
答案3
得分: -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)
英文:
g(func(fst,snd int) int { return snd }(f()))
or defined snd
func snd(x, y int) int {
return y
}
g(snd(f()))
or if function return array
func f() ([2]int) {
return [2]int{2, 3}
}
g(f()[1])
答案4
得分: -1
没有更简单的方法。
一个可能的解决方案可能是这样的:
g(f().1)
在Go语言中没有对这样一个特性的语法支持。
英文:
There isn't a simpler way.
A possible solution would look for example like this:
g(f().1)
There is no syntactic support for a feature like this one in Go.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论