Golangでは、パッケージレベル変数と関数レベル変数は異なるスコープと目的を持ちます。
パッケージレベル変数:
- スコープ:
パッケージレベル変数は関数の外、つまり関数の中ではなく、通常はGoソースファイルの一番上に宣言されます。
同じパッケージ内のすべての関数からアクセスできます。
パッケージがインポートされるときに初期化されます。
- 初期化:
パッケージがロードされるときに初期化され、パッケージ内の関数が呼び出される前に初期化されます。
明示的な初期化が必要です。初期化されていない場合、ゼロ値が割り当てられます。
- 使用法:
パッケージ全体で共有されるデータや設定などの値を保持するために使用されます。
同じパッケージ内の異なる関数間でデータを共有するのに役立ちます。
関数レベル変数:
- スコープ:
関数レベル変数は関数内で宣言され、その関数内でのみアクセス可能です。
他の関数からはアクセスできません。
- 初期化:
関数が呼び出されるたびに初期化されます。
初期化はオプションですが、初期化されていない場合、ゼロ値が割り当てられます。
- 使用法:
関数内でのみ必要な一時的なデータを保持するために使用されます。
特定の関数のローカルスコープでのみアクセス可能であり、他の関数に影響を与えません。
変数定義の種類
- var キーワードを使用した変数定義:
var キーワードを使用して変数を定義します。この方法では、変数の型を指定することができますが、初期値は与えられません。
var age int
var name string
var isStudent bool
- 短い変数宣言(Short Variable Declaration)
:=
:
短い変数宣言 := を使用して変数を定義および初期化します。この方法では、変数の型は右辺の値から推論されます。
age := 30
name := "John"
isStudent := true
ただし、この方法は関数内でのみ使用できます。
- 明示的な型指定付きの変数定義:
変数の型を明示的に指定して変数を定義し、必要に応じて初期化します。
var temperature float64 = 25.5
var country string = "USA"
var (
a, b int = 5, 3
c string = "Hello"
)
この方法は、変数の型を明示的に指定する場合や、パッケージレベルの変数を定義する場合に使用されます。
- ゼロ値(Zero Value):
変数が初期化されない場合、その変数には型に応じたゼロ値が割り当てられます。数値型のゼロ値は 0、文字列型のゼロ値は空の文字列 ""、ブール型のゼロ値は false です。
var num int // num には 0 が割り当てられる
var text string // text には空の文字列が割り当てられる
var flag bool // flag には false が割り当てられる
例:
package main
import "fmt"
// パッケージレベル変数
var packageVar int = 100
func main() {
// 関数レベル変数
var localVar int = 50
fmt.Println("Package-level variable:", packageVar)
fmt.Println("Function-level variable:", localVar)
}
このコードでは、packageVar
はパッケージレベルの変数であり、localVar
は関数レベルの変数です。packageVar
は main
関数の外で宣言されており、main
関数の内部である localVar
とは異なるスコープを持っています。