はじめに
関数の中で名前付き戻り値を使った場合、:=
と =
の使い分けをします。
この記事では、Goにおける :=
と =
の違い、そして名前付き戻り値との関係について書きたいと思います。
:= と = の基本的な違い
そもそもの基本的な説明
記号 | 意味 | 例 | 説明 |
---|---|---|---|
:= |
変数の宣言と初期化 | x := 10 |
新しい変数 x を定義して値を代入 |
= |
代入のみ | x = 20 |
すでにある x に新しい値を代入 |
つまり、:=
は 「この変数はこのスコープで初めて出てきます」 という宣言です。
名前付き戻り値とは?
Goでは関数の戻り値に「名前」をつけることができます。
func getUser() (name string, err error) {
// name と err はすでにこの関数の中で使える
name = "Alice"
err = nil
return
}
このようにすると、name
と err
は関数のスコープ内で既に定義された変数になります。
そのため、関数内では :=
を使わず、=
で値を代入します。
以下のように :=
を使ってしまうとどうなるでしょうか?
func getUser() (name string, err error) {
name := "Alice"
err := nil
return
}
これは一見正しそうですが、実は新しいローカル変数 name
と err
を作っているだけです。
関数の戻り値である name
と err
には値が代入されていないため、呼び出し側では ""
と nil
のままになってしまいます。
もちろん、戻り値に名前をつけずに書くこともできます。
func getUser() (string, error) {
name := "Alice"
err := nil
return name, err
}
このようにすれば、スコープ内で新しく name
と err
を宣言しても問題ありません。
関数の外に値を渡すには return name, err
のように明示的に指定する必要があります。
まとめ
-
:=
は新しい変数を定義するときに使う -
=
は既存の変数に値を代入するときに使う - 名前付き戻り値を使う場合、その変数はすでに定義済みなので
=
を使うべき - 名前付き戻り値を使っているのに
:=
を使ってしまうと、値が返らないことがある