Go-scope-rules

提供:Dev Guides
移動先:案内検索

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