How does this example of a Go closure work?
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?
No comments:
Post a Comment