为什么我可以通过以下方式在 Go 中定义迭代器:
func f() func() int {
i := 1
return func() int {
i++
return i
}
}
但这会导致变量未使用错误(i
is not used)吗?
func f() func() int {
i := 1
return func() (i int) {
i++
return
}
}
主要功能:
func main() {
iter := f()
fmt.Println(iter())
fmt.Println(iter())
fmt.Println(iter())
fmt.Println(iter())
}
对我来说,这两个版本做的完全一样:它们使用 f
作为迭代器。 f
使用闭包(更具体地说是 i
)。第一个版本显式返回递增的 i
,第二个版本通过命名返回类型引用它隐式返回。
对我来说两个版本是一样的,为什么我会收到错误?
最佳答案
在第二种情况下,返回值 (i int)
隐藏了外部声明 i := 1
。所以这是未使用的第一个 i
。这意味着第二个示例根本不是闭包。
从范围界定的角度来看,您的第二个示例与:
func f() func() int {
i := 1
return func(i int) int {
i++
return
}
}
在这种情况下,应该清楚内部 i
是不同的,并且遮蔽了外部。
关于go - 使用命名返回类型时未使用变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55590783/