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通过命名返回类型引用它来显式地返回一个增量,第二个隐式地。
对我来说,这两个版本是相同的,那么为什么会出现错误?
在第二种情况下,返回值(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是不同的,并且阴影在外部。