ok, result := true, "A"
fmt.Printf("memory address of result: %p\n", &result)
if ok {
result := "B"
fmt.Printf("memory address of result: %p\n", &result)
println(result)
} else {
result := "C"
println(result)
}
println(result)
このGo言語のコードは、変数のスコープとメモリアドレスの取得に関する例です。
ok, result := true, "A"
fmt.Printf("memory address of result: %p\n", &result)
-
変数の初期化:
-
ok
とresult
という2つの変数を同時に初期化しています。ok
はtrue
、result
は"A"
という文字列です。 -
:=
演算子を使っているため、これらの変数は新たに宣言されます。
-
-
メモリアドレスの表示:
-
fmt.Printf
を使ってresult
のメモリアドレスを表示しています。&result
でresult
のアドレスを取得し、%p
フォーマットを指定してポインタ形式で出力します。
-
if ok {
result := "B"
fmt.Printf("memory address of result: %p\n", &result)
println(result)
} else {
result := "C"
println(result)
}
-
条件分岐:
-
if ok
の条件がtrue
なので、if
ブロック内が実行されます。 -
result := "B"
で新たにresult
という変数を宣言し、スコープがif
ブロック内に限定されます。このresult
はA
とは異なる変数です。
-
-
再びメモリアドレスの表示:
- 新しく宣言した
result
のメモリアドレスを表示します。これはB
を指します。
- 新しく宣言した
-
println
の実行:-
println(result)
でB
が出力されます。
-
-
else
ブロック:-
else
ブロックは実行されませんが、else
の中でも同様にresult := "C"
とすると、新たにresult
が定義され、そのスコープはelse
ブロック内に限られます。
-
println(result)
-
最終的な出力:
-
println(result)
はif
ブロックの外にあるため、最初に定義したresult
(つまり"A"
)が出力されます。この時、if
ブロックで宣言したresult
はスコープ外になっているため、影響を与えません。
-
まとめ
-
result
は最初に"A"
として定義され、if
ブロック内で新たにresult
が"B"
として定義されていますが、これは別の変数です。 -
if
ブロック外でのprintln(result)
は最初の"A"
を表示します。