I was thinking of your answer, and I don't understand when you say: > within a func type literal such as `func() (x int)`, the scope of the > parameters and results is restricted to the type literal itself. > Because the following code works, so the scope of a parameter is different than the scope of a result.
const N = 10 func main() { f := fibo(0) for i := 0; i < N; i++ { fmt.Println(f()) } } func fibo(x int) func() int { y := 1 return func() int { defer func() { x, y = y, x+y }() return x } } On Tuesday, 10 October 2017 17:08:49 UTC+2, Etienne Daspe wrote: > > Thank you for the answer :) > > Etienne > > On Tuesday, 10 October 2017 16:58:43 UTC+2, Ian Lance Taylor wrote: >> >> On Tue, Oct 10, 2017 at 7:22 AM, <etienn...@gmail.com> wrote: >> > >> > I'm trying to understand the scope of variables when using closures. >> > I wrote a simple program to compute fibonacci sequence with a closure >> (see >> > below). >> > Knowing that named return variables are initialized to 0 (when their >> type is >> > int), I tried to simplify my function ; but it doesn't compile, saying >> that >> > x is undefined. >> > I conclude that the scope of a return variable isn't the same as a >> "classic" >> > variable, but I don't understand why. >> > >> > Can you explain me the difference of scope between these two kind of >> > variables please? And the reason why they don't share the same scope? >> > >> > My program in the Go Playground: https://play.golang.org/p/KPWK9xoNNZ >> > >> > >> > const N = 10 >> > >> > func main() { >> > f := fibo() >> > for i := 0; i < N; i++ { >> > fmt.Println(f()) >> > } >> > } >> > >> > func fibo() func() int { >> > x, y := 0, 1 >> > return func() int { >> > defer func() { x, y = y, x+y }() >> > return x >> > } >> > } >> > >> > // fibo2 doesn't compile because x is undefined in the function >> returned. >> > //func fibo2() func() (x int) { >> > // y := 1 >> > // return func() int { >> > // defer func() { x, y = y, x+y }() >> > // return x >> > // } >> > //} >> >> In the commented out code, x is a result variable, but only for >> `func() (x int)`. x is not a result variable for fibo2. >> >> To put it differently, within a func type literal such as `func() (x >> int)`, the scope of the parameters and results is restricted to the >> type literal itself. >> >> Ian >> > -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.