`if` における変数のシャドウイング
CoddyのGOジャーニー「基礎」セクションの一部。レッスン 37/109。
if文における変数のシャドーイングについて学びましょう。if文では条件の前に変数を宣言でき、その変数はifブロックと、それに対応するelseブロックの中でのみ存在します。外側にある変数と同じ名前の場合、それらのブロック内では外側の変数をシャドーイング(隠す)します。
まず、条件文の外で変数を作成しましょう。
x := 10
fmt.Println("Original x value:", x)このコードを実行すると、値が10の変数 x ができ、プログラム全体で使用できます。
次に、if文で新しい変数yを宣言しましょう。これはifブロックとelseブロックの中でのみ存在します。
if y := x * 2; y > 15 {
fmt.Println("y is greater than 15:", y)
// y はこのブロック内でのみ存在する
} else {
fmt.Println("y is not greater than 15:", y)
// y は else ブロック内でも使用できる
}このコードを実行すると、Goはyを20(つまりx * 2)として計算し、それが15より大きいかどうかを確認してから、最初のブロックを実行します。画面には次のように表示されます。
y is greater than 15: 20最後に、if文の後で変数にアクセスしてみましょう。
// fmt.Println(y) はエラーになります - ここには y が存在しないためです
fmt.Println("x is still:", x)このコードを実行した後もxにはアクセスできますが、yはifブロックとelseブロック内にしか存在しなかったため、利用できなくなります。画面には次のように表示されます。
x is still: 10これは、if 文で宣言された変数のスコープを示しています。変数 y は、宣言された条件ブロック内でのみアクセスできます。外側に y はないため、ここでは何もシャドーイングされません。代わりに x という名前を付けていた場合、そのブロック内では外側の x をシャドーイングしますが、ブロックを抜けた後も外側の x は 10 のままです。
チャレンジ
初心者このチャレンジでは、if文での変数のシャドーイングを練習します。ifブロック内で宣言した変数は、外側のスコープにある変数と同じ名前でも、異なる値を持てることを確認します。
コードには、外側のスコープにmessageという変数があります。ifブロック内に同じ名前のシャドーイングされた変数を作成し、その後、両方の変数を出力してシャドーイングの効果を確認してください。
自分で試してみよう
package main
import "fmt"
func main() {
// 外側のスコープの変数
message := "Hello from outer scope"
isLoggedIn := true
if isLoggedIn {
// TODO: 値が "Hello from inner scope" の新しい変数 'message' を作成する
// これは内側のスコープの message を出力する
fmt.Println(message)
}
// これは外側のスコープの message を出力する
fmt.Println(message)
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
基礎のすべてのレッスン
6制御フロー:条件分岐
`if` 文`else` キーワード`else if` キーワード`if` における変数のシャドウイング変数の初期化`switch` 文式を伴う `switch`式を伴わない `switch``fallthrough` キーワードまとめ:条件分岐自分で練習してみよう: Goオンラインコンパイラ