Go 部分使用命名结果参数设置默认值

Go 部分使用命名结果参数设置默认值,go,Go,假设我有一个有3个返回值的函数。我设置了其中两个的值,如果不设置,我想将第三个保留为默认值。像这样的- func call(a int) (int, int, r3 string){ // return a, a+1, "no error" // stmt 1 // return a, a+1 // stmt 2 // return // stmt 3 } 在未注释stmt 2

假设我有一个有3个返回值的函数。我设置了其中两个的值,如果不设置,我想将第三个保留为默认值。像这样的-

func call(a int) (int, int, r3 string){

  //        return a, a+1, "no error" // stmt 1
  //        return a, a+1             // stmt 2
  //        return                    // stmt 3
}
在未注释stmt 2或stmt 3的情况下运行,我得到以下错误-

duplicate argument int
int is shadowed during return
duplicate argument int
cannot use a (type int) as type string in return argument
cannot use a + 1 (type int) as type string in return argument
int在这里是如何隐藏的?返回列表没有命名的int参数

在未注释stmt 1的情况下运行时,出现以下错误-

duplicate argument int
int is shadowed during return
duplicate argument int
cannot use a (type int) as type string in return argument
cannot use a + 1 (type int) as type string in return argument
有人能解释这些错误的来源吗

是否不可能有命名结果参数的部分列表(甚至在使用命名结果参数时返回变量)

在参数或结果列表中,名称(IdentifierList) 要么全部出席,要么全部缺席。如果有,每个名字 表示指定类型的一项(参数或结果),以及 签名中的所有非空名称必须是唯一的。如缺席,则每人 type代表该类型的一项


游乐场:

输出:

tmp/sandbox842451638/main.go:4:33: duplicate argument int
tmp/sandbox842451638/main.go:6:2: int is shadowed during return
tmp/sandbox842451638/main.go:10:47: duplicate argument int
tmp/sandbox842451638/main.go:12:2: int is shadowed during return
tmp/sandbox842451638/main.go:16:34: duplicate argument int
tmp/sandbox842451638/main.go:18:2: int is shadowed during return

call1
call2
的缩写。如您所见,您有重复的返回参数名称
int
:“签名中的所有非空名称必须是唯一的。”第一个返回参数名称
int
被第二个返回参数名称
int
遮挡


如果您想要匿名返回参数,可以使用空白标识符。

package main

// duplicate argument int
func callA(a int) (int, int, r3 string) {
    // int is shadowed during return
    return
}

func callB(a int) (_ int, _ int, r3 string) {
    return
}

func main() {}

游乐场:

如果重新声明,同名变量不会出现阴影?我将(一个int)改为(一个bool),但在空返回时仍然得到相同的阴影错误。@peterSO我相信这是不正确的:“调用参数,
(一个int)
,键入
int
,被返回参数名称
int
”将其改为
(一个float64)
,您会得到相同的错误,将一个return int更改为float64,则会丢失错误。错误的意思是,名为
int
的第一个返回变量被名为
int
的第二个返回变量隐藏。