English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Golang 基礎トレーニング

Golang 控制文

Golang 関数 & メソッド

Golang 構造体

Golang スライス & 配列

Golang 文字列(String)

Golang ポインタ

Golang インターフェース

Golang 并行処理

Golang例外(Error)

Golang 他の雑多な事項

Go言語の変数のスコープ

前提条件:Go 言語の変数

変数のスコープは、特定の変数にアクセスできるプログラムの一部として定義できます。クラス、メソッド、ループなどで変数を定義できます。Cのように / C ++同じGolangでは、すべての識別子はリエキシティック(または静的)スコープを持っており、変数のスコープはコンパイル時に決定できます。または、変数はその定義されたコードブロックからのみ呼び出せると言えます。

Golangの変数の範囲ルールは、変数が宣言された場所によって2つのカテゴリーに分けることができます:

  • ローカル変数(ブロックや関数の内部で宣言)

  • グローバル変数(ブロックや関数の外部で宣言)

ローカル変数

  • 関数やブロック内で宣言された変数はローカル変数と呼ばれます。これらは関数やブロックの外からアクセスできません。

  • これらの変数は、for、while文などの内部で宣言することもできます。

  • しかし、これらの変数は関数内のネストされたコードブロックからアクセスできます。

  • これらの変数はブロック変数とも呼ばれます。

  • 同じ名前でこれらの変数を同一の範囲で二度宣言すると、コンパイル時エラーが発生します。

  • 関数の実行が終了すると、これらの変数は存在しません。

  • ループ外で宣言された変数もネストされたループ内でアクセスできます。これは、メソッドやすべてのループがグローバル変数をアクセスできることを意味します。ローカル変数はループからアクセスでき、その関数内で実行されます。

  • ループ内で宣言された変数はループ外では見えません。

//ローカル変数
package main
import "fmt"
//メイン関数
func main() {
    //ここからメイン関数のローカル作用域が始まります
    //メイン関数内のローカル変数
    var myvariable1, myvariable2 int = 69, 145
    // 変数の値を表示
    fmt.Printf("myvariable1 変数の値 :%d\n", myvariable1)
    fmt.Printf("myvariable2 変数の値 :%d\n", myvariable2)
} // ここではメイン関数のローカル作用域が終了します

出力:

myvariable1 変数の値 : 69
myvariable2 変数の値 : 145

グローバル変数

  • 関数やブロックの外に定義された変数はグローバル変数と呼ばれます。

  • これらはプログラムの全体のライフサイクルで利用可能です。

  • これらはすべての関数やブロックの外のプログラムの先頭で宣言されます。

  • これらはプログラムのどの部分からでもアクセスできます。

//グローバル変数
package main
import "fmt"
// グローバル変数の宣言
var myvariable1 int = 100
func main() {
    // メイン関数内のローカル変数
    var myvariable2 int = 200
    //グローバル変数を表示
    fmt.Printf("グローバル変数 myvariable1 の値は :%d\n", myvariable1)
    //ローカル変数を表示
    fmt.Printf("ローカル変数 myvariable2 の値は :%d\n", myvariable2)
    //関数を呼び出す
    display()
}
func display() {
    // グローバル変数を表示
    fmt.Printf("グローバル変数 myvariable1 の値は :%d\n", myvariable1)
}

出力:

グローバル変数 myvariable1 の値は : 100
ローカル変数 myvariable2 の値は : 200
グローバル変数 myvariable1 の値は : 100

注意:関数内にグローバル変数と同名のローカル変数がある場合、どのようなことが起こりますか?

答えは単純です。つまり、コンパイラはローカル変数を選択します。通常、同じ名前の二つの変数が定義された場合、コンパイラはコンパイル時エラーを生成します。しかし、変数が異なる範囲で定義された場合、コンパイラはそれを許可します。グローバル変数と同名のローカル変数が定義された場合、コンパイラはそのローカル変数を選択します。

例:以下のプログラムでは、出力がはっきりと見えます。myvariable1の値は200、これは関数mainで提供されます。したがって、ローカル変数はグローバル変数よりも高い優先順位を持つと言えます。

//Goプログラムはコンパイラの優先順位を表示
//グローバル変数上のローカル変数
package main
import "fmt"
//グローバル変数の宣言
var myvariable1 int = 100
func main() {
    //メイン関数内のローカル変数
    //とグローバル変数が同じ
    var myvariable1 int = 200
    // 表示
    fmt.Printf("変数 myvariable1 の値は :%d\n", myvariable1)
}

出力:

変数 myvariable1 の値は : 200