The range clause introduces a new scope. See this version of your second example: https://play.golang.org/p/UXI_w6B4DW5
-- Ian On Sun, 12 Jan 2020, at 8:09 AM, Silvan Jegen wrote: > Hi fellow gophers > > The following code compiles > > > package main > > import ( > "fmt" > ) > > func main() { > mymap := map[string]int{"a": 1, "b": 2} > for k, v := range mymap { > k, v := k, v > fmt.Printf("k %s, v: %d\n", k, v) > } > } > > > while this one doesn't. > > > package main > > import ( > "fmt" > ) > > func main() { > a := 1 > b := 2 > a, b := a, b > fmt.Printf("a %d, b: %d\n", a, b) > } > > > I looked at the language spec and for the ':=' (the "walrus operator") in > the "Short variable declarations"[0] section the spec says the following. > > "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." > > This explains why the second example doesn't compile since none of the > variables in the second short variable declaration is new. > > The same is true for the first example however and this one compiles > just fine (even when using a short variable declaration on only one > variable like in 'k := k' which shouldn't be allowed either according > to this quote). > > The only explanation for this that I could come up with after being asked > about this case is that the variables declared in the range clause are > a special case, the so called "iteration variables" according to the > "For statements" section[1]. The spec does not mention this but for > these "iteration variables" the rules for the regular short variable > declaration don't seem to uply. If that is indeed the case, I wonder if > the spec shouldn't be updated to reflect this. > > Is this really the case or am I missing something? > > > Cheers, > > Silvan > > > [0] https://golang.org/ref/spec#Short_variable_declarations > [1] https://golang.org/ref/spec#For_statements > > -- > 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. > To view this discussion on the web visit > https://groups.google.com/d/msgid/golang-nuts/3L6DOOAAM4RP6.2NDJ7GRYRRO2B%40homearch.localdomain. > -- 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. To view this discussion on the web visit https://groups.google.com/d/msgid/golang-nuts/e61675a2-7e2e-449b-b443-cc6487d9cfe5%40www.fastmail.com.