dongxue7306 2019-04-09 10:34
浏览 40
已采纳

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

Why can I do the following to define an iterator in Go:

func f() func() int {
    i := 1
    return func() int {
        i++
        return i
    }
}

but this will result in a variable not used error (i is not used)?

func f() func() int {
    i := 1
    return func() (i int) {
        i++
        return
    }
}

main function:

func main() {
    iter := f()
    fmt.Println(iter())
    fmt.Println(iter())
    fmt.Println(iter())
    fmt.Println(iter())
}

To me both versions do exactly the same: They use f as an iterator. f makes use of closures (more specifically i). The first version explicitly returns an incremented i and the second implicitly, by referring to it via a named return type.

To me both versions are the same, so why do I get an error?

  • 写回答

1条回答 默认 最新

  • dongmou3615 2019-04-09 10:36
    关注

    In the second case, the return value (i int) shadows the outer declaration i := 1. So it's this first i that is unused. This means the second example isn't a closure at all.

    From a scoping standpoint, your second example is the same as:

    func f() func() int {
        i := 1
        return func(i int) int {
            i++
            return
        }
    }
    

    In this case, it should be clear that the inner i is distinct, and shadows the outer one.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 如何处理复杂数据表格的除法运算
  • ¥15 如何用stc8h1k08的片子做485数据透传的功能?(关键词-串口)
  • ¥15 有兄弟姐妹会用word插图功能制作类似citespace的图片吗?
  • ¥200 uniapp长期运行卡死问题解决
  • ¥15 请教:如何用postman调用本地虚拟机区块链接上的合约?
  • ¥15 为什么使用javacv转封装rtsp为rtmp时出现如下问题:[h264 @ 000000004faf7500]no frame?
  • ¥15 乘性高斯噪声在深度学习网络中的应用
  • ¥15 关于docker部署flink集成hadoop的yarn,请教个问题 flink启动yarn-session.sh连不上hadoop,这个整了好几天一直不行,求帮忙看一下怎么解决
  • ¥15 深度学习根据CNN网络模型,搭建BP模型并训练MNIST数据集
  • ¥15 C++ 头文件/宏冲突问题解决