sebdehne
sebdehne

Reputation: 382

Multi-variable short redeclaration when inside a for loop creates a new variable?

The documenation states:

As a consequence, redeclaration can only appear in a multi-variable short declaration. Redeclaration does not introduce a new variable; it just assigns a new value to the original.

But how does this work in for loops? See this example. It seems that the variable "nextPos", which has a scope outside the loop, actually gets redeclared inside the loop for the inner scope, and thus looses its value for each iteration. This version works though.

Upvotes: 3

Views: 965

Answers (2)

user6169399
user6169399

Reputation:

Let's show how it works, with these code samples:

Let's simplify your first sample, see this working sample code (1):

package main

import "fmt"

func main() {
    a := 100
    {
        fmt.Println(a) // 100
        a, b := 0, 0
        fmt.Println(a, b) // 0 0
    }
    fmt.Println(a) // 100
}

output:

100
0 0
100

so a in a, b := 0, 0 is shadowed, this a is new variable,
this is called Variable scoping and shadowing,
and you may name it e.g. c like this code for now to show how it works (2):

package main

import "fmt"

func main() {
    a := 100
    {
        fmt.Println(a) // 100
        c, b := 0, 0
        fmt.Println(c, b) // 0 0
    }
    fmt.Println(a) // 100
}

the output is that same as (1):

100
0 0
100

and lets simplify your next sample code (3):

package main

import "fmt"

func main() {
    a := 0
    b := byte(0)
    {
        fmt.Println(a, b) // 0 0
        a, b = 1, byte(1)
        fmt.Println(a, b) // 1 1
    }
    fmt.Println(a, b) // 1 1
}

output:

0 0
1 1
1 1

so here a and b are the same inside and outside loop.

also see: Where can we use Variable Scoping and Shadowing in Go?
and see: What is the difference between := and = in Go?

Upvotes: 3

abhink
abhink

Reputation: 9126

That's how the short assignment statement := works. From the specs:

Unlike regular variable declarations, a short variable declaration may redeclare variables provided they were originally declared earlier in the same block (or the parameter lists if the block is the function body) with the same type, and at least one of the non-blank variables is new. As a consequence, redeclaration can only appear in a multi-variable short declaration. Redeclaration does not introduce a new variable; it just assigns a new value to the original.

Thus, in your first example, you can see that there is one new variable, namely nextB, and this re-declares nextPos as well for each loop iteration.

In the second case, both nextB and nextPos have already been declared and hence no re-declaration occurs. Also note that you are using = as the compiler would not allow := for the same reason, i.e. no new variables declared.

Upvotes: 1

Related Questions