Go の変数のスコープのワナ

おそらく誰もが一度ははまるであろう現象だと思うのでメモ。
例えば、下記のようなコードがあったとする。

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

コメント

タイトルとURLをコピーしました