首页 > 解决方案 > 从多重返回函数中命名接收变量

问题描述

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()

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

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

标签: goreturn-value

解决方案


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

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)
}

当然,如果你在其他地方使用它,你也可以命名结构,但如果你只是想命名字段,则没有必要。


推荐阅读