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)
}

上記の実例を実行すると、出力結果は次のようになります:

结果: 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)
}

上記の実例を実行すると、出力結果は次のようになります:

结果: 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)
}

上記の実例を実行すると、出力結果は次のようになります:

结果: 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;
}

上記の実例を実行すると、出力結果は次のようになります:

main()函数中 a = 10
sum() 函数中 a = 10
sum() 函数中 b = 20
main()函数中 c = 30

ローカル変数とグローバル変数の初期化

異なる型のローカル変数とグローバル変数のデフォルト値は次のとおりです:

データ型 初期化デフォルト値
int 0
float32 0
pointer nil
その他の拡張