【Go】コロンイコール(:=)って何?

さて、最近ちょこっとだけGoを触っていたのですが、その時にまず最初にへ?ってなったことが代入のようなものとは別にコロンとイコールのものがあることでした。

今日はそれについて調べてみます。

":="とは・・・?

さて、このコロンとイコールが連なっているもの、以下のような使われ方をします。

a := "hoge"

初めて見ると本当には?ってなるんですが...

やっていることはとても簡単で

"変数aを定義して、そこに値を代入してあげる"

だけです。

基本的にはvarで変数定義をするのですが、省略記法としてコロンイコール":="を使用することができます。

英語ではありますが、以下で詳細がみれます。

上記例にあるとおり、複数の値を同時に定義、代入も可能ですし、関数からの返り値に対して使うことも可能です。

Goでとてもよく使われるショートハンドなので、しっかり覚えたいところですね。

使い分けについて

さて、わざわざショートハンドがあるわけですが具体的な使い分けってどうなんでしょうか...?

var hoge = 1

hoge :=1

varを使っても普通に定義はできます。

ただ、ショートハンドでできないこととして、再代入があります。

以下の例をみてみると、わかりやすいかと思います。

https://play.golang.org/p/wFpQemJ5SFj

func main() {
	hoge := 1
	huga, hoge := 5, 10

	fmt.Printf("Hello, playground %d : %d",hoge, huga)
}

hogeは変数の定義が二回行われていることがわかりますね。

通常、varで再定義を2度行うと怒られてしまいます。

// エラーになってしまう
func main() {
	hoge := 1
	var huga, hoge = 5, 10

	fmt.Printf("Hello, playground %d : %d",hoge, huga)
}

つまり、再代入をしたい場合等は":="が都合がよかったりもします。

よく関数の返り値としてエラーを返す"err"に再代入が使われている気がします。

あとは初期値がない場合はvarで定義しないとダメかもしれません。

:=だと代入もやってしまいます。

そのため、ただ変数を定義して、なんらかの関数からの返り値をそれに代入したい!

という場合でも変数定義のついでに初期値を入れないといけません。

0や""(空文字)を入れておくのも手かもしれませんが...

特に意味のない初期値ならそんな値はないほうが良いでしょう。

そうするくらいなら以下のように型を明示した変数の入れ物を用意する方がわかり訳すなるはずです。

var hoge int

とりあえずはここら辺が使い分けの基準になってくるのかな〜?ってところです。

まとめ

コロンイコール":="は変数定義と代入を同時にしてくれる優れもの!

使えばコードがとっても短くなる!

けど、使い所は見極めよう!

それでわ!

おすすめの記事