変数を定義する (var)/ゼロ値について

Go 言語では明示的に型を指定した変数定義と、コンパイラによる型推論を利用した変数定義を行うことができます。

変数定義の基本

Go 言語では、var キーワードを使用して、var 変数名 型名 というフォーマットで変数定義します。 Pascal や Ada のように、型名を後ろに指定することに注意してください。

var x int

同じ型の変数を複数定義するときは、下記のように型名を一度だけ記述するだけで済みます(逆に、var x int, y int, z int のように冗長に記述することはできません)。

var x, y, z int

括弧を使用して複数行に分けて変数定義することもできます。

var (
	name string
	age  int
)

変数の初期値を指定する

= キーワードを使用して、変数の初期値を指定することができます。

var x int = 100
var a, b int = 100, 200
var (
	name string = "Rei Ayanami"
	age  int    = 14
)

Go には型推論の仕組みが備わっているため、変数の初期値を指定する場合は、型の記述を省略することができます。

var x = 100
var a, b = 100, 200
var (
	name = "Rei Ayanami"
	age  = 14
)

関数の中で変数を定義するときは、:= を使用することで var と型の記述を両方とも省略することができます。

func hello() {
	s := "yatta-ne"
	x, y := 100, 200
	// ...
}

ちなみに、変数の型は fmt.Printf 関数のフォーマット文字列で %T を指定して確認することができます。

func main() {
	x := 100
	fmt.Printf("%T\n", x)  //=> int
}

変数のグルーピング

var ( ... ) というシンタックスは、変数のグルーピングのために利用することもできます。 下記は、本家の Effective Go (Commentary) からの抜粋ですが、エラー情報を表す変数を var ( ... ) でグループ化して定義し、グループに対してコメントを付加しています。

// Error codes returned by failures to parse an expression.
var (
    ErrInternal      = errors.New("regexp: internal error")
    ErrUnmatchedLpar = errors.New("regexp: unmatched '('")
    ErrUnmatchedRpar = errors.New("regexp: unmatched ')'")
    ...
)

ゼロ値

変数の定義時に初期値を指定しなかった場合、それぞれの型の ゼロ値 (Zero Value) が初期値として設定されます。

ゼロ値
整数0
浮動小数点数0.0
文字列 (string)""(空文字列)
真偽値 (bool)false
構造体 (struct)各フィールドがゼロ値の構造体
配列各要素がゼロ値の配列
その他(ポインタ、スライス、マップ、関数、インタフェース、チャネル)nil

例えば、var i int とだけ記述した場合、i の初期値は 0 になります。

var i int
fmt.Println(i);  //=> 0

ポインタの初期値は nil です。

var p *int
fmt.Println(p);  //=> nil