Goの省略変数宣言とスコープ

package main

import (
	"fmt"
	"log"
	"strconv"
)

var val int64 = 42

func main() {
	fmt.Printf("%p: %v\n", &val, val)
	val, err := strconv.ParseInt("21", 10, 32)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("%p: %v\n", &val, val)
}

実行結果

0x112b268: 42
0xc00012a008: 21
var, err := strconv.ParseInt("21", 10, 32)

この部分で、変数errは宣言されていないから省略変数宣言を使ったらvalも変数宣言されてしまった。

解消するにはerrの変数宣言を別に書いて、strconv.ParseInt()の返り値は代入を行うようにする。

package main

import (
	"fmt"
	"log"
	"strconv"
)

var val int64 = 42

func main() {
	fmt.Printf("%p: %v\n", &val, val)
	var err error
	val, err = strconv.ParseInt("21", 10, 32)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("%p: %v\n", &val, val)
}

実行結果

0x112b268: 42
0x112b268: 21

同じ変数名が使えるのはC/C++を普段書いている身からすると不思議な気分になった。

利点があまり思いつかないから、何か便利な使い方があったら知りたい。

今回の件とはあまり関係ないけど、Goのエンティティのアドレス配置はどんな感じなんだろうか。

そのうちGoのアセンブリとか読みたい。