Go言語の変数スコープ
スコープとは、宣言された識別子が表す定数、型、変数、関数、またはパッケージがソースコード内で作用する範囲のことです。
Go言語では変数は3つの場所で宣言できます:
- 関数内で定義された変数はローカル変数と呼ばれます。
- 関数の外で定義された変数はグローバル変数と呼ばれます。
- 関数定義の中の変数は仮引数と呼ばれます。
次に、ローカル変数、グローバル変数、仮引数について具体的に見ていきましょう。
ローカル変数
関数本体内で宣言された変数をローカル変数と呼びます。そのスコープは関数本体内のみです。パラメータと戻り値の変数もローカル変数です。
次の実例では、main() 関数がローカル変数 a, b, c を使用しています:
実例
package main
import "fmt"
func main() {
/* ローカル変数の宣言 */
var a, b, c int
/* パラメータの初期化 */
a = 10
b = 20
c = a + b
fmt.Printf ("結果: a = %d, b = %d and c = %d\n"\n", a, b, c)
}
import "fmt"
func main() {
/* ローカル変数の宣言 */
var a, b, c int
/* パラメータの初期化 */
a = 10
b = 20
c = a + b
fmt.Printf ("結果: a = %d, b = %d and c = %d\n"\n", a, b, c)
}
上記の実例を実行すると、出力結果は次のようになります:
结果: a = 10, b = 20 and c = 30
グローバル変数
関数の外部で宣言された変数をグローバル変数と呼びます。グローバル変数はパッケージ全体、さらには外部のパッケージ(エクスポート後)でも使用できます。
グローバル変数はどの関数でも使用できます。次の実例は、グローバル変数の使用方法を示しています:
実例
package main
import "fmt"
/* グローバル変数の宣言 */
var g int
func main() {
/* ローカル変数の宣言 */
var a, b int
/* パラメータの初期化 */
a = 10
b = 20
g = a + b
fmt.Printf("結果: a = %d, b = %d and g = %d\n"\n", a, b, g)
}
import "fmt"
/* グローバル変数の宣言 */
var g int
func main() {
/* ローカル変数の宣言 */
var a, b int
/* パラメータの初期化 */
a = 10
b = 20
g = a + b
fmt.Printf("結果: a = %d, b = %d and g = %d\n"\n", a, b, g)
}
上記の実例を実行すると、出力結果は次のようになります:
结果: a = 10, b = 20 and g = 30
Go言語プログラムでは、グローバル変数とローカル変数の名前を同じにすることができますが、関数内のローカル変数が優先されます。実例は次のとおりです:
実例
package main
import "fmt"
/* グローバル変数の宣言 */
var g int = 20
func main() {
/* ローカル変数の宣言 */
var g int = 10
fmt.Printf ("結果: g = %d\n"\n", g)
}
import "fmt"
/* グローバル変数の宣言 */
var g int = 20
func main() {
/* ローカル変数の宣言 */
var g int = 10
fmt.Printf ("結果: g = %d\n"\n", g)
}
上記の実例を実行すると、出力結果は次のようになります:
结果: g = 10
仮引数
仮引数は関数のローカル変数として使用されます。実例は次のとおりです:
実例
package main
import "fmt"
/* グローバル変数の宣言 */
var a int = 20;
func main() {
/* main関数でローカル変数を宣言 */
var a int = 10
var b int = 20
var c int = 0
fmt.Printf("main()関数内 a = %d\n"\n", a);
c = sum( a, b);
fmt.Printf("main()関数内 c = %d\n"\n", c);
}
/* 関数定義 - 2つの数値を加算 */
func sum(a, b int) int {
fmt.Printf("sum() 関数内 a = %d\n"\n", a);
fmt.Printf("sum() 関数内 b = %d\n"\n", b);
return a + b;
}
import "fmt"
/* グローバル変数の宣言 */
var a int = 20;
func main() {
/* main関数でローカル変数を宣言 */
var a int = 10
var b int = 20
var c int = 0
fmt.Printf("main()関数内 a = %d\n"\n", a);
c = sum( a, b);
fmt.Printf("main()関数内 c = %d\n"\n", c);
}
/* 関数定義 - 2つの数値を加算 */
func sum(a, b int) int {
fmt.Printf("sum() 関数内 a = %d\n"\n", a);
fmt.Printf("sum() 関数内 b = %d\n"\n", b);
return a + b;
}
上記の実例を実行すると、出力結果は次のようになります:
main()函数中 a = 10 sum() 函数中 a = 10 sum() 函数中 b = 20 main()函数中 c = 30
ローカル変数とグローバル変数の初期化
異なる型のローカル変数とグローバル変数のデフォルト値は次のとおりです:
| データ型 | 初期化デフォルト値 |
|---|---|
| int | 0 |
| float32 | 0 |
| pointer | nil |