使用命名返回类型时不使用变量

Use*_*645 -4 closures iterator go

为什么我要执行以下操作在Go中定义迭代器:

func f() func() int {
    i := 1
    return func() int {
        i++
        return i
    }
}
Run Code Online (Sandbox Code Playgroud)

但这会导致变量未使用错误(i未使用)?

func f() func() int {
    i := 1
    return func() (i int) {
        i++
        return
    }
}
Run Code Online (Sandbox Code Playgroud)

主功能:

func main() {
    iter := f()
    fmt.Println(iter())
    fmt.Println(iter())
    fmt.Println(iter())
    fmt.Println(iter())
}
Run Code Online (Sandbox Code Playgroud)

对我而言,这两个版本的功能完全相同:它们f用作迭代器。f利用闭包(更具体地讲i)。第一个版本i通过命名返回类型引用它来显式地返回一个增量,第二个隐式地。

对我来说,这两个版本是相同的,那么为什么会出现错误?

Fli*_*mzy 5

在第二种情况下,返回值(i int)遮盖了外部声明i := 1。因此,这是第一个i未使用的。这意味着第二个例子根本不是闭包。

从范围的角度来看,您的第二个示例与以下示例相同:

func f() func() int {
    i := 1
    return func(i int) int {
        i++
        return
    }
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,应该清楚的是内部i是不同的,并且阴影在外部。

  • @ User12547645:“结果参数充当普通的局部变量,并且该函数可以根据需要为其分配值。” 与往常一样,请阅读《 Go编程语言规范》:https://golang.org/ref/spec。 (2认同)