コンテンツにスキップ

Go言語の変数宣言の整理

A variable declaration creates one or more variables, binds corresponding identifiers to them, and gives each a type and an initial value.

(変数宣言は1つ以上の変数を作成し、識別子を紐付け、それぞれに「型」と「初期値」を与える)

— The Go Programming Language Specification より

Go言語における変数は、どのような宣言方法であっても「型」と「値」の両方を必ず持つ。 一見すると様々な変数宣言の記法が存在するが、すべてはこの「変数には型と値が必要」という大原則を満たすために、「プログラマが明示するか、コンパイラに補わせるか」の違いでしかない。

型と値の両方を明示する(基本形)

Section titled “型と値の両方を明示する(基本形)”

最も丁寧な書き方であり、変数に必要な「型」と「値」の両方をプログラマが明示する。

変数の宣言において、不足している情報が何もない状態である。

var name string = "Taro"

この記述では、型(string)と値("Taro")の両方を明示的に指定している。 これがGo言語における変数宣言の最も基本となる形である。 しかし、毎回両方を書くのは冗長であるため、Go言語では状況に応じて片方を省略(コンパイラに推論・補完)させる記法が用意されている。

値の指定を省略する(ゼロ値)

Section titled “値の指定を省略する(ゼロ値)”

「型」だけを指定して「値」の指定を省略した場合、コンパイラが自動的に初期値を補ってくれる。

あとから値を代入する場合など、宣言時に具体的な値が決まっていない場合に用いられる。

var name string

この記述では、型(string)だけを指定し、初期値を省略している。 しかし「変数には値が必要」であるため、Go言語では自動的にその型のゼロ値(文字列なら ""、数値なら 0 など)が初期値として割り当てられる。 つまり、プログラマが値を書かなくても、コンパイラが裏で値を与えているのである。

型の指定を省略する(型推論)

Section titled “型の指定を省略する(型推論)”

「値」だけを指定して「型」の指定を省略した場合、コンパイラが右辺の値から型を推論して補ってくれる。

初期値が明確に決まっている場合、記述を簡潔にするために用いられる。 型の省略には、var を使う方法と := を使う方法の2種類がある。

値があるため、型名を書かなくてもコンパイラが自動的に型を決定する。

var name = "Taro"

右辺の "Taro" という値から、コンパイラは name 変数の型を string であると推測する。 これにより、プログラマは型の記述を省略できる。

:=(ショート変数宣言)を用いる場合

Section titled “:=(ショート変数宣言)を用いる場合”

var すらも省略し、さらに短く記述するための記法である。

name := "Taro"

これも var で型を省略した場合と全く同じで、右辺の値("Taro")からコンパイラが型を推測する。 関数の中でのみ使用可能という制限はあるが、コードが最も簡潔になるため、Go言語で最も多用される記法である。

Go言語の変数宣言は、すべて「型と値の両方を決定する」ための手続きである。

変数宣言の記法は、プログラマが何を記述し、コンパイラに何を任せるかによって整理できる。

  • 型と値の両方を書くvar name string = "Taro" (すべてプログラマが決定)
  • 型だけを書くvar name string (値はコンパイラがゼロ値を補う)
  • 値だけを書くvar name = "Taro" または name := "Taro" (型はコンパイラが値から推論する)

このように整理することで、Go言語の変数宣言のバリエーションは、単なる暗記ではなく論理的なルールとして理解することができる。

varと:=の使い分けの基準は何ですか?

関数内で初期値が決まっており、簡潔に書きたい場合は := (ショート変数宣言)を使用する。一方、パッケージレベルでの宣言、初期値を後で代入するためにゼロ値で初期化したい場合、または明示的に型を指定したい場合は var を使用する。

関数の中で、あえてvarを使った宣言をするのはどのような場合か?

関数内で宣言と同時に初期値を入れるなら := (ショート変数宣言)を使用するが、主に以下の2つのケースではあえて var を使用する。

  • ゼロ値を使いたい(変数だけ用意したい)場合:後続の if 文や for ループの中で値を代入することが決まっており、とりあえず初期状態(ゼロ値)で用意しておきたい場合。
  • 型を明示的に指定したい場合:推論される型とは別の型で変数を作りたい場合(例:初期値が 0 だが、型は int ではなく float64 にしたい場合など)。

このように、「とりあえず変数を用意した」「型を厳密に指定した」というプログラマの意図をコード上に明確にするために使い分ける。

Google検索で優先ソースに設定する

Google 検索で優先ソースとして表示

他の記事を探す