🌊

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