Go言語の変数と定数
2026/09/07

変数宣言

varで型と初期値を明示できます。型を省略すると右辺から推論します。関数内では:=による短い変数宣言も使えます。

var x int = 10
var y = 20        // 型推論でint
z := 30           // 短い変数宣言(関数内のみ)

パッケージ直下では:=は使えず、varが必要です。

package demo

var count = 0 // OK
// n := 1     // コンパイルエラー: パッケージレベルでは:=不可

宣言した変数を使わないとコンパイルエラーになります。意図的に捨てるときは_へ代入します。

x := 1
_ = x

同じブロック内で複数の変数をまとめられます。

var (
    host = "localhost"
    port = 8080
)

複数の変数に同時代入することもできます。関数や一時変数を使わなくても変数の値を入れ替えることもできます。

func swap(a, b int) (int, int) { return b, a }
x, y = 1, 2
x, y = swap(x, y) // 2, 1

x, y = y, x

ゼロ値

Go言語には未初期化のローカル変数はなく、宣言された変数は常にゼロ値か、明示的な初期化値を持ちます。

ゼロ値
数値0
boolfalse
string""
ポインタ、スライス、マップ、チャネル、関数、インターフェースnil
構造体各フィールドのゼロ値
配列各要素のゼロ値

nilは使うための内部のデータ構造がまだ用意されていない状態を表します。操作がその内部構造への読み書きを前提にするとパニックになります。内部構造がなくても意味がある操作や、appendなどの必要ならこちらで確保する操作は動きます。

var m map[string]int     // m == nil
// m["x"] = 1            // ハッシュ表が無いのでpanic
m = make(map[string]int) // または m = map[string]int{}
m["x"] = 1

var s []int
s = append(s, 1) // 要素を格納する配列を確保して動く

定数宣言

定数はコンパイル時に評価できる式に限られます。変数の参照や関数呼び出しは定数式にならず、コンパイルエラーになります。

const Pi = 3.14159
const (
    StatusOK       = 200
    StatusNotFound = 404
)

var limit = 10
// const max = limit              // コンパイルエラー: 変数は定数式に使えない
// const n = len([]int{1, 2, 3})  // コンパイルエラー: スライスの長さは定数にならない
// const now = time.Now()         // コンパイルエラー: 実行時の値は使えない

iota

定数宣言ブロック内でiotaは行ごとに0から増える連番です。新しいconstブロックを開くとiotaは0にリセットされます。

const (
    Sunday = iota // 0
    Monday        // 1
    Tuesday       // 2
)

式と組み合わせた例です。各行でiotaの値が先に決まり、その行の式に代入されます。

const (
    _  = iota             // 0を捨てる
    KB = 1 << (10 * iota) // 1024
    MB                    // 1048576
    GB                    // 1073741824
)