はじめに
Go言語の変数について説明します。
Go言語の変数宣言
Go言語では、変数を宣言する際にはvarキーワードを使用します。以下は、変数の宣言方法の例です。
var foo int // int型の変数fooを宣言
foo = 123 // fooに123を代入
変数の宣言と同時に初期化することもできます。
var bar string = "hello" // string型の変数barを宣言して、"hello"で初期化
また、型を明示しなくても、初期化式からGo言語は変数の型を推論できます。
var baz = true // bool型の変数bazを宣言して、trueで初期化
複数の変数を宣言することもできます。
var x, y int = 1, 2 // int型の変数x, yを宣言して、それぞれ1, 2で初期化
さらに、変数の型宣言を省略することもできます。この場合、初期化式から変数の型が推論されます。
foo := 123 // int型の変数fooを宣言して、123で初期化
bar := "hello" // string型の変数barを宣言して、"hello"で初期化
複数の変数を省略形式で宣言することもできます。
x, y := 1, 2 // int型の変数x, yを宣言して、それぞれ1, 2で初期化
Go言語では、未初期化の変数はその型のゼロ値で初期化されます。例えば、int型の未初期化変数は0で初期化されます。
var i int // int型の変数iを宣言して、初期化しない
fmt.Println(i) // 出力: 0
var s string // string型の変数sを宣言して、初期化しない
fmt.Println(s) // 出力: "" 空文字
また、変数を宣言する際には、型宣言の代わりに型推論を使用することができます。
i := 123 // int型の変数iを宣言して、123で初期化
s := "hello" // string型の変数sを宣言して、"hello"で初期化
定数もconstを使用して宣言することができます。定数は宣言と同時に初期化しなければなりません。
const pi = 3.14159 // float64型の定数piを宣言して、3.14159で初期化
Go言語の変数同士の代入や演算
Go言語では、複合代入演算子を使用して、変数に対して複数の演算を一度に実行することができます。以下は、複合代入演算子の例です。
var i int
i += 10 // i = i + 10
i -= 5 // i = i - 5
i *= 2 // i = i * 2
i /= 3 // i = i / 3
i %= 2 // i = i % 2
上記の例では、int型の変数iを宣言し、その後に複合代入演算子を使用して、iに10を加えたり、5を引いたり、2を掛けたり、3で割ったり、2で割った余りを求めたりしています。
インクリメント・デクリメント演算子
インクリメント・デクリメント演算子を使用して、変数を1つずつ増減させることができます。以下は、インクリメント・デクリメント演算子の例です。
var i int = 10
i++ // i = i + 1
i-- // i = i - 1
int型の変数iを宣言し、その後にインクリメント・デクリメント演算子を使用して、iを1つずつ増減させています。
Go言語の変数のスコープ
Go言語では、変数にはスコープと呼ばれる有効範囲があります。スコープによって、変数がどの範囲内で有効かが決まります。変数のスコープは、変数が宣言された場所によって決まります。
Go言語では、変数のスコープには以下の4つがあります。
- ブロックスコープ
- 関数スコープ
- パッケージスコープ
- グローバルスコープ
ブロックスコープ
ブロックスコープとは、中括弧 {} で囲まれた範囲のことを指します。ブロックスコープ内で宣言された変数は、そのブロック内でのみ有効です。ブロックを抜けると、その変数は破棄されます。
例えば、以下のコードでは、if文のブロック内で変数iを宣言しています。そのため、変数iはif文のブロック内でのみ有効であり、if文の外で使用することはできません。
if x := 10; x > 5 {
var i int = 20
fmt.Println(i) // => 20
}
fmt.Println(i) // コンパイルエラー。変数iはif文のブロック外で未定義
関数スコープ
関数スコープとは、関数内で宣言された変数が、その関数内でのみ有効であることを指します。関数の引数も関数スコープ内で宣言されたものとして扱われます。関数を抜けると、関数スコープ内で宣言された変数は破棄されます。
例えば、以下のコードでは、関数foo内で変数iを宣言しています。そのため、変数iはfoo関数内でのみ有効であり、foo関数の外で使用することはできません。
func foo() {
var i int = 10
fmt.Println(i) // => 10
}
foo()
fmt.Println(i) // コンパイルエラー。変数iはfoo関数の外で未定義
パッケージスコープ
パッケージスコープとは、パッケージ内で宣言された変数が、そのパッケージ内のすべてのファイルで参照可能であることを指します。ただし、変数名の先頭が大文字の場合に限り、他のパッケージからも参照可能となります。
// fooパッケージの変数iは、fooパッケージ内のすべてのファイルで参照可能
var i int = 10
func Foo() {
fmt.Println(i) // => 10
}
// 変数jは、他のパッケージからは参照できない
var j int = 20
// 変数Jは、他のパッケージからも参照可能
var J int = 30
この例では、変数iはfooパッケージ内のすべてのファイルで参照可能であり、Foo関数でも参照できます。一方、変数jはfooパッケージ内でしか参照できず、他のパッケージからは参照できません。変数Jは、他のパッケージからも参照可能であり、変数名の先頭が大文字であるため、他のパッケージからも参照できます。
グローバルスコープ
グローバルスコープとは、パッケージスコープと同様に、パッケージ内で宣言された変数が参照可能であることを指します。ただし、グローバルスコープでは、変数名の先頭が大文字であっても、他のパッケージからは参照できません。
例えば、以下のようにグローバル変数を定義することができます。
// 変数iは、パッケージスコープと同様にパッケージ内のすべてのファイルで参照可能
var i int = 10
func Foo() {
fmt.Println(i) // => 10
}
ただし、変数iが定義されたパッケージから他のパッケージからは参照できません。変数名の先頭が大文字であっても、グローバルスコープでの参照はできません。
以上が、Go言語における変数の説明でした。