go - 使用命名返回类型时未使用变量

标签 go iterator closures

为什么我可以通过以下方式在 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/

相关文章:

c - 如何在 GO 中将 "_Ctype_int"更改为 "int"?

architecture - 去应用服务器?

go - 当我不知道 yaml 中每个可能的字段时,如何修改 go 中的 yaml 字段?

iterator - 在向量中存储 Peekable 迭代器时无法推断出适当的生命周期

c++ - std::unordered_set::equal_range 迭代器问题

ios - 从闭包中快速获取变量的值

Javascript:嵌套(双)for循环内的setTimeout闭包

swift - 为什么添加闭包捕获列表会阻止我的实例被释放?

来自 x509 证书的 golang 主题 DN

iterator - 如何编写值加倍迭代器?