使用命名结果params部分设置默认值

时间:2017-11-27 07:56:29

标签: go

我们说我有一个带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

有人可以解释这些错误的来源吗?

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

1 个答案:

答案 0 :(得分:3)

  

The Go Programming Language Specification

     

Function types

     

在参数或结果列表中,名称(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

call1call2的简写。如您所见,您有重复的返回参数名称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() {}

游乐场:https://play.golang.org/p/CS1x9mmIh6