dsvjmc0907 2013-08-13 17:47
浏览 39
已采纳

Go封闭示例如何工作?

I'm reading a (really good) Go book and saw this example, but I don't see how it works.

func makeEvenGenerator() func() uint {
    i := uint(0)
    return func() (ret uint) {
        ret = i
        i += 2
        return
    }
}
func main() {
    nextEven := makeEvenGenerator()
    fmt.Println(nextEven()) // 0
    fmt.Println(nextEven()) // 2
    fmt.Println(nextEven()) // 4
}

Incrementing i is common closure behaviour. That's fine. But if you look at nextEven, it's a function that takes no arguments and returns a uint called ret. But what's the point of naming the return value? Won't any code that calls this use its own variable name?

And the return statement returns nothing - so what's being printed? How is 0 / 2 / 4 coming out of this function?

And how is this different from doing this:

func makeEvenGenerator() func() uint {
    i := uint(0)
    return func() uint {
        current := i
        i += 2
        return current
    }
}

Which seems much simpler and makes things more obvious. Is there some deep Go / math concept that I'm missing?

  • 写回答

1条回答 默认 最新

  • dougang1967 2013-08-13 17:52
    关注

    The return statement that is returning "nothing" is returning the named result parameter ret. Named result parameters (http://golang.org/doc/effective_go.html#named-results) are syntactic sugar that introduce local variables in the function that will be returned if there's a bare return.

    In this specific case, there's no benefit to using one and it probably does confuse more than it helps.

    Usually there are two cases where named result parameters are of use: When wanting to change return values from a defer, and for the sake of documenting their use, as can often be seen with functions that return two or more values, such as Read(b []byte) (n int, err error)

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

报告相同问题?

悬赏问题

  • ¥15 unity第一人称射击小游戏,有demo,在原脚本的基础上进行修改以达到要求
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看
  • ¥15 关于#Java#的问题,如何解决?
  • ¥15 加热介质是液体,换热器壳侧导热系数和总的导热系数怎么算
  • ¥100 嵌入式系统基于PIC16F882和热敏电阻的数字温度计
  • ¥15 cmd cl 0x000007b
  • ¥20 BAPI_PR_CHANGE how to add account assignment information for service line
  • ¥500 火焰左右视图、视差(基于双目相机)
  • ¥100 set_link_state
  • ¥15 虚幻5 UE美术毛发渲染