命名来自多个返回函数的接收变量

时间:2019-07-19 17:03:54

标签: go return-value

Go允许多个命名的返回值,但是接收变量呢?在处理返回值时,它们是否受到保护?

比方说,我们从这里开始:

func foo() (i int, j int) {
   i = 1
   j = 2
   return
}

a, b := foo()

现在,如果其他一些编码器出现并对foo的定义进行以下更改,该怎么办:

func foo() (j int, i int) {

我的调用函数无效。那么,是否也可以从调用方命名返回的值。例如,如果我这样称呼它:

(a:i, b:j) := foo()

然后,我将它们附加到命名的返回值上,而不是按照它们返回的顺序分配它们。

那么,有没有办法解决这个问题?

1 个答案:

答案 0 :(得分:1)

这与重新排列输入参数没有什么不同。通常,除非您打算进行重大更改,否则不要这样做。但是,如果您想通过名称而不是位置来处理事物,则需要一个结构。例如,您可以使用匿名结构:

func foo() struct {
    i int
    j int
} {
    return struct {
        i int
        j int
    }{1, 2}
}

func main() {
    result := foo()
    fmt.Println(result.i, result.j)
}

当然,如果在其他地方使用过该结构,也可以命名该结构,但是如果您只想命名字段,则不需要。