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

huangapple go评论97阅读模式
英文:

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.

huangapple
  • 本文由 发表于 2011年11月23日 08:40:25
  • 转载请务必保留本文链接:https://go.coder-hub.com/8235938.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定