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?