我们说我有一个带3个返回值的函数。我设置了其中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
如何在这里阴影?返回列表没有命名的int参数。
运行stmt 1取消注释,我得到以下错误 -
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
有人可以解释这些错误的来源吗?
是否不可能有命名结果参数的部分列表(甚至在使用命名结果参数时返回变量)?
答案 0 :(得分:3)
The Go Programming Language Specification
在参数或结果列表中,名称(IdentifierList) 必须全部存在或全部缺席。如果存在,每个名称 代表指定类型的一个项目(参数或结果)和 签名中的所有非空白名称必须是唯一的。如果缺席,每个 type代表该类型的一个项目。
package main
// duplicate argument int
func call1(a int) (int, int, r3 string) {
// int is shadowed during return
return
}
// duplicate argument int
func call2(a int) (int string, int string, r3 string) {
// int is shadowed during return
return
}
// duplicate argument int
func call3(a bool) (int, int, r3 string) {
// int is shadowed during return
return
}
func call4(a int) (int, r2, r3 string) {
return
}
func call5(a int) (r1, r2, r3 string) {
return
}
func main() {}
游乐场:https://play.golang.org/p/PUhY7Y0H9f
输出:
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() {}