Go-scope-rules
Go-スコープルール
プログラミングのスコープとは、定義された変数が存在し、それを超えると変数にアクセスできないプログラムの領域です。 Goプログラミング言語で変数を宣言できる場所は3つあります-
関数またはブロック内(*ローカル*変数)
すべての関数の外側(*グローバル*変数)
関数パラメーターの定義( formal パラメーター)
*local* および *global* 変数と *formal* パラメーターとは何かを調べてみましょう。
ローカル変数
関数またはブロック内で宣言される変数は、ローカル変数と呼ばれます。 それらは、その関数またはコードブロック内にあるステートメントでのみ使用できます。 ローカル変数は、自身の外部の関数には認識されません。 次の例では、ローカル変数を使用しています。 ここで、変数a、b、およびcはすべてmain()関数に対してローカルです。
package main
import "fmt"
func main() {
/*local variable declaration*/
var a, b, c int
/*actual initialization*/
a = 10
b = 20
c = a + b
fmt.Printf ("value of a = %d, b = %d and c = %d\n", a, b, c)
}
上記のコードをコンパイルして実行すると、次の結果が生成されます-
value of a = 10, b = 20 and c = 30
グローバル変数
グローバル変数は、関数の外側、通常はプログラムの上部で定義されます。 グローバル変数は、プログラムの存続期間を通じてその値を保持し、プログラムに定義された関数のいずれかからアクセスできます。
グローバル変数には、どの関数からもアクセスできます。 つまり、グローバル変数は、宣言後にプログラム全体で使用できます。 次の例では、グローバル変数とローカル変数の両方を使用します-
package main
import "fmt"
/*global variable declaration*/
var g int
func main() {
/*local variable declaration*/
var a, b int
/*actual initialization*/
a = 10
b = 20
g = a + b
fmt.Printf("value of a = %d, b = %d and g = %d\n", a, b, g)
}
上記のコードをコンパイルして実行すると、次の結果が生成されます-
value of a = 10, b = 20 and g = 30
プログラムはローカル変数とグローバル変数に同じ名前を付けることができますが、関数内のローカル変数の値が優先されます。 たとえば-
package main
import "fmt"
/*global variable declaration*/
var g int = 20
func main() {
/*local variable declaration*/
var g int = 10
fmt.Printf ("value of g = %d\n", g)
}
上記のコードをコンパイルして実行すると、次の結果が生成されます-
value of g = 10
正式なパラメーター
仮パラメータは、その関数内のローカル変数として扱われ、グローバル変数よりも優先されます。 たとえば-
package main
import "fmt"
/*global variable declaration*/
var a int = 20;
func main() {
/*local variable declaration in main function*/
var a int = 10
var b int = 20
var c int = 0
fmt.Printf("value of a in main() = %d\n", a);
c = sum( a, b);
fmt.Printf("value of c in main() = %d\n", c);
}
/*function to add two integers*/
func sum(a, b int) int {
fmt.Printf("value of a in sum() = %d\n", a);
fmt.Printf("value of b in sum() = %d\n", b);
return a + b;
}
上記のコードをコンパイルして実行すると、次の結果が生成されます-
value of a in main() = 10
value of a in sum() = 10
value of b in sum() = 20
value of c in main() = 30
ローカル変数とグローバル変数の初期化
ローカル変数とグローバル変数は、デフォルト値の0に初期化されます。一方、ポインターはnilに初期化されます。
Data Type | Initial Default Value |
---|---|
int | 0 |
float32 | 0 |
pointer | nil |