おそらく誰もが一度ははまるであろう現象だと思うのでメモ。
例えば、下記のようなコードがあったとする。
package main
import "fmt"
func main() {
val := 10
if true {
val := 20
fmt.Printf("%d\n", val)
}
fmt.Printf("%d\n", val)
}
上記で注意すべきは、main() の直下の val と、ifブロックの中の val は別物であること。
これは if 文に限らず、Goではブロックで定義された変数は、スコープがブロックの中だけにとどまるという仕様による。
上記の場合、if文の直下の := は代入だけでなく定義文も含むため、mainの直下の val とは別の変数として定義される。
上記の理由により、実行結果は下記となる。
20 10
コメント