ローカルスコープとグローバルスコープ
メニューを表示するにはスワイプしてください
この時点で、スコープの概念について掘り下げ、特定の変数(または定数)がどこでアクセスでき、どこでできないかを理解することが重要です。
変数や定数のスコープは、それがどこで使用できるかを定義します。
変数や定数がいかなるコードブロックの外側で宣言された場合、それはプログラム全体でアクセス可能となり、グローバルスコープを持つと見なされます。次のコードスニペットでは、定数 pi がこのグローバルスコープの例となっています。
index.go
12345678package main import "fmt" const pi float32 = 3.1415 func main() { fmt.Println(pi) }
一方で、変数や定数がコードブロック内で宣言された場合、それはその特定のコードブロックおよび、該当する場合は入れ子になったコードブロック内でのみアクセス可能となります。
以下の図は、グローバルスコープとローカルスコープの違いを示しています。
次のコードは、変数へのアクセスが許可される範囲と、エラーが発生する可能性のある箇所を示しています。
index.go
12345678910111213141516171819202122232425262728package 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
12345678func myFunc() { var number int = 7 fmt.Println(number) // Accessible here } func main() { fmt.Println(number) // Not accessible here }
もう一つ重要な点として、同じスコープまたは重複するスコープ内で、同じ名前の変数を2つ以上宣言することはできない。
index.go
1234567891011func 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
1234567891011121314151617package 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() }
フィードバックありがとうございます!
AIに質問する
AIに質問する
何でも質問するか、提案された質問の1つを試してチャットを始めてください