ホーム プログラミング言語 golang go syntax Go言語の変数のスコープ

Go言語の変数のスコープ


 
 
変数 (定数、型、または関数) には、プログラム内でスコープと呼ばれる特定のスコープがあります。

 

Go 言語を学ぶには変数のスコープを理解することがより重要です。Go 言語はコンパイル時に各変数が使用されているかどうかをチェックし、未使用の変数が現れるとコンパイル エラーが報告されるからです。変数のスコープを理解できない場合、原因不明のコンパイル エラーが発生する可能性があります。

変数が定義される場所に応じて、次の 3 つのタイプに分類できます。

  • 関数内で定義された変数はローカル変数と呼ばれます
  • 関数の外で定義された変数はグローバル変数と呼ばれます
  • 関数定義内の変数は仮パラメータと呼ばれます

個別にご紹介しましょう。

ローカル変数

関数本体内で宣言された変数をローカル変数といい、その有効範囲は関数本体内のみであり、関数のパラメータや戻り値変数もすべてローカル変数となります。

ローカル変数は常に存在するわけではなく、それを定義する関数が呼び出された後にのみ存在し、関数呼び出しが終了するとローカル変数は破棄されます。

[例] 次の main() 関数は、ローカル変数 a、b、c を使用します。

package main 

import (
    "fmt"
)

func main() {
    //ローカル変数 a と b を宣言して値を与える
    var a int = 3
    var b int = 4
    //ローカル変数 c を宣言して、a と b の合計を計算する
    c := a + b
    fmt.Printf("a = %d, b = %d, c = %d\n", a, b, c)
} 

実行結果は次のとおりです。

a = 3, b = 4, c = 7

グローバル変数

関数本体の外で宣言された変数はグローバル変数と呼ばれます。グローバル変数は 1 つのソース ファイルで定義するだけでよく、すべてのソース ファイルで使用できます。もちろん、このグローバル変数が含まれていないソース ファイルは、次のコマンドを使用してインポートする必要があります。 「import」キーワード グローバル変数は、グローバル変数が配置されているソース ファイルの後でのみ使用できます。

グローバル変数宣言は var キーワードで始める必要があり、外部パッケージで使用する場合はグローバル変数の最初の文字を大文字にする必要があります。

【例】以下のコードでは、6行目でグローバル変数cを定義しています。

package main

import "fmt"

//グローバル変数の宣言
var c int

func main() {
    //ローカル変数の宣言
    var a, b int

    //パラメータの初期化
    a = 3
    b = 4
    c = a + b

    fmt.Printf("a = %d、b = %d、c = %d\n", a、b、c)
} 

実行結果は次のとおりです。

a = 3, b = 4, c = 7

Go 言語プログラムでは、グローバル変数とローカル変数の名前を同じにすることができますが、関数本体内のローカル変数が優先されます。

package main

import "fmt"

//グローバル変数を宣言
var a float32 = 3.14

func main() {
    //ローカル変数を宣言
    var a int = 3

    fmt.Printf("a = %d\n", a)
} 

実行結果は次のとおりです。

a = 3

仮パラメータ

関数を定義する際、関数名の後ろの括弧内の変数を仮引数(仮引数といいます)といいます。仮パラメータは関数が呼び出されたときにのみ有効になり、関数呼び出しが終了すると破棄されます。関数が呼び出されないとき、関数の仮パラメータは実際の記憶装置を占有せず、実際の値を持ちません。

仮パラメータは関数のローカル変数として使用されます。

[例] 以下のコードの 21 行目では、仮パラメータ a と b を定義しています。

package main

import (
     "fmt"
)

//グローバル変数a
var a int = 13

func main() {
     //ローカル変数aとb
     var a int = 3
     var b int = 4

     fmt.Printf("main()関数: a = %d\n", a)
     fmt.Printf("main()関数: b = %d\n", b)
     c:= sum(a、b)
     fmt.Printf("main()関数: c = %d\n", c)
}

func sum(a、b int) int {
     fmt.Printf("sum()関数: a = %d\n", a)
     fmt.Printf("sum()関数: b = %d\n", b)
     num:= a+b
     return num
} 

実行結果は次のとおりです。

main() 関数: a = 3
main() 関数: b = 4
sum() 関数: a = 3
sum() 関数: b = 4
main()関数: c = 7

 

「 Go言語の変数のスコープ」についてわかりやすく解説!絶対に観るべきベスト2動画

Go言語とは?|プログラミング言語のGo言語について3分でわかりやすく解説します【プログラミング初心者向け】
【Go言語 超入門コース】07.データ型 |変数に入れるデータの種類のことです【プログラミング初心者向け入門講座】