【Go】ショート形式 := が関数内でしか使えない理由とvarの重要性
はじめに
最近、Goを学び始めたのですがコードの書き方で多くの疑問が出てきたので、その中でも特に押さえておきたい事象についてまとめてみました。
Goのコードを書いていると、「ショート形式:=が関数内でしか使えないのはなぜ?」や「varはなぜ関数外でも使えるの?」と疑問に思うことがありますよね。この記事では、これらの疑問を解決しつつ、Goの設計思想に迫ります。
ショート形式:=とは?
:=はGo言語で「ショート形式の変数宣言」として知られています。以下のように、型推論を用いた簡潔な記法で、変数を宣言して初期化できます。
func main() {
x := 10 // int型の変数xを宣言し、初期化
fmt.Println(x)
}
:=はとても便利ですが、関数内でしか使えません。その理由を見ていきましょう。
ショート形式:=が関数内でしか使えない理由
Goではショート形式:=が関数外での利用を禁止しています。その理由は以下の通りです。
- スコープを明確にするため
:=で宣言された変数は、そのスコープ(範囲)内でのみ使用可能です。例えば、関数内で宣言された変数は、関数の外に影響を与えません。この制約があることで、以下のような一時的な変数を扱うのに適しています。
func calculate() {
result := 42 // 関数内のローカル変数
fmt.Println(result)
}
一方で、関数外の変数はパッケージ全体で共有されるスコープを持ちます。このようなグローバルスコープの変数を:=で宣言できるようにすると、意図せずスコープが不明瞭になり、可読性を損ねる恐れがあります。
2. グローバル変数は明示的に宣言すべきという設計思想
Goの設計思想では、グローバルスコープの変数は明示的に宣言するべきとされています。そのため、関数外の変数を宣言する際は、varを使って「グローバル変数である」と明示的に書くことを求めています。
一方でvarはなぜ関数外で使えるのか?
varはGoで最も基本的な変数宣言の方法であり、ローカル変数にもグローバル変数にも利用できます。
以下の例をご覧ください。
package main
var globalVar int = 42 // パッケージ全体で使える変数
func main() {
localVar := 10 // 関数内のローカル変数
fmt.Println(globalVar, localVar)
}
varが関数外でも使える理由
- スコープを明示するため
- 関数外でvarを使うと、その変数がグローバルスコープに属することが明確になります。
- 構造化されたコードを保証するため
- グローバル変数の存在は慎重に扱う必要があり、varによる宣言は意図的であることを強調します。
ショート形式とvarの違いを整理
特徴 | ショート形式 := | var |
---|---|---|
使用できるスコープ | 関数内のみ | 関数内・関数外の両方 |
明示性 | 暗黙的な型推論 | 明示的に型や初期値を指定可能 |
設計意図 | ローカル変数向け | グローバル変数もサポート |
利用シーン | 簡易な変数宣言 | 明示的に変数を宣言する必要がある場面 |
まとめ
Goのショート形式:=が関数内でしか使えないのは、「スコープを明確化し、ローカル変数としての利用に限定するため」です。一方、varはグローバル変数も含めて明示的に宣言するために使用されます。Goの設計思想に基づいたこれらの制約により、コードの可読性が高まり、意図しないバグを防ぐことができます。ぜひこの知識を活かして、より洗練されたGoのコードを書いてみてください。
Discussion