🌊
Goにおける = と := の違い
この記事の背景
コードを書く作業と、マネジメントの作業を行ったりきたりすると忘れるので、自分のために
Goにおける = と := の違いについてメモ
Goにおける = と := の違い
✅:=(ショート変数宣言)
新しく変数を宣言しつつ代入する
関数の中でのみ使える(パッケージレベルでは使えない)
x := 10 // x を新たに宣言して 10 を代入
これは次と同じ意味です:
var x int = 10
✅=(代入)
すでに宣言されている変数に代入
再代入や値の更新に使う
x := 10
x = 20 // すでにある x に新しい値を代入
🚫 間違えやすい例
x = 10 // ❌ エラー: x が宣言されていない
x := 10
x := 20 // ❌ エラー: x はすでに宣言されている
✅ 複数代入では := で一部が新規でもOK
x := 1
x, y := 2, 3 // ✅ x は再代入、y は新しく宣言される
| 演算子 | 意味 | 使える場所 |
|---|---|---|
:= |
宣言+代入(初回) | 関数内だけ |
= |
代入(すでにある変数に) | どこでも使える |
なぜ関数外で := 使えないのか
Go で := が関数外(= グローバルスコープ)で使えない理由は、言語の設計思想として「明示的で安全な初期化」を重視しているからです。
func main() {
msg := "hello" // ローカル変数。型を明示しなくてよい
}
:= は、型推論と宣言の簡略化を目的としている
関数内で完結する一時的な処理に最適
| スコープ | 使える構文 | 理由 |
|---|---|---|
| 関数内 | := |
型推論で簡潔に書けるから |
| グローバル(関数外) | var |
可読性・初期化順・安全性を重視 |
Rob Pike(Go 言語の設計者の1人)によると:
“Short variable declarations (:=) are intended primarily for use inside functions, to help make code shorter and more readable. At the package level, clarity is more important than brevity.”
(意訳)
「:= は関数内でコードを簡潔にするためのものであり、パッケージレベルでは、簡潔さよりも明示性・明確さが重要。」
Discussion