Menu
CoddyTech

`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 のままです。

challenge icon

チャレンジ

初心者

このチャレンジでは、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)
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

基礎のすべてのレッスン

自分で練習してみよう: Goオンラインコンパイラ