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.

Reply via email to