Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
学ぶ ローカルスコープとグローバルスコープ | 関数
Go入門

bookローカルスコープとグローバルスコープ

メニューを表示するにはスワイプしてください

この時点で、スコープの概念について掘り下げ、特定の変数(または定数)がどこでアクセスでき、どこでできないかを理解することが重要です。

変数や定数のスコープは、それがどこで使用できるかを定義します。

変数や定数がいかなるコードブロックの外側で宣言された場合、それはプログラム全体でアクセス可能となり、グローバルスコープを持つと見なされます。次のコードスニペットでは、定数 pi がこのグローバルスコープの例となっています。

index.go

index.go

copy
12345678
package main import "fmt" const pi float32 = 3.1415 func main() { fmt.Println(pi) }

一方で、変数や定数がコードブロック内で宣言された場合、それはその特定のコードブロックおよび、該当する場合は入れ子になったコードブロック内でのみアクセス可能となります。

以下の図は、グローバルスコープとローカルスコープの違いを示しています。

次のコードは、変数へのアクセスが許可される範囲と、エラーが発生する可能性のある箇所を示しています。

index.go

index.go

copy
12345678910111213141516171819202122232425262728
package main import "fmt" func main() { var value_1 int = 1 // Condition 1 if(true) { var value_2 int = 2 // Condition 2 if (true) { var value_3 int = 3 fmt.Println("In Condition 2:", value_1) fmt.Println("In Condition 2:", value_2) fmt.Println("In Condition 2:", value_3) } fmt.Println("In Condition 1:", value_1) fmt.Println("In Condition 1:", value_2) fmt.Println("In Condition 1:", value_3) // Error here } fmt.Println("In Main:", value_1) fmt.Println("In Main:", value_2) // Error here fmt.Println("In Main:", value_3) // Error here }

変数 value_1 は、main() コードブロック全体、および Condition 1 や Condition 2 のようなネストされたコードブロック内でも参照可能。

また、Condition 1 およびその中にネストされた Condition 2 でもアクセス可能。

ただし、main() ブロックの外で直接アクセスしようとするとエラーとなる。同様に、Condition 2 内で宣言された変数 value_2 は、その特定のコードブロック内でのみアクセス可能。

関数の文脈でスコープを考慮することが重要。関数内で変数や定数を宣言した場合、それはその関数内に限定され、他の関数(main() を含む)からはアクセスできない。

注意

main() は、プログラム実行時に自動的に実行される関数として機能。

index.go

index.go

copy
12345678
func myFunc() { var number int = 7 fmt.Println(number) // Accessible here } func main() { fmt.Println(number) // Not accessible here }

もう一つ重要な点として、同じスコープまたは重複するスコープ内で、同じ名前の変数を2つ以上宣言することはできない。

index.go

index.go

copy
1234567891011
func myFunc1() { var number int = 7 var number int = 9 // Error here } func myFunc2() { var number int = 7 if(2 > 1) { var number int = 9 // Error here } }

ただし、異なるスコープで同じ名前の変数を宣言することは可能です。

index.go

index.go

copy
1234567891011121314151617
package main import "fmt" func myFunc1() { var number int = 7 fmt.Println("In Func 1:", number) } func myFunc2() { var number int = 9 fmt.Println("In Func 2:", number) } func main() { myFunc1() myFunc2() }
question mark

エラーを回避するために、var value int = 6 をどのスコープに配置する必要がありますか?

正しい答えを選んでください

すべて明確でしたか?

どのように改善できますか?

フィードバックありがとうございます!

セクション 4.  2

AIに質問する

expand

AIに質問する

ChatGPT

何でも質問するか、提案された質問の1つを試してチャットを始めてください

セクション 4.  2
some-alt