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のアセンブリとか読みたい。