Goで、構造体の値返しとポインタ返しの使い分け
Goに限らないトピックかもしれません。
次のような、データベースからデータを読み込む関数(インライン展開されない)を利用する関数があったとします。返されたオブジェクトの生存期間はこの関数内のみとします。
func doSomething() {
// getUser()はDBから読み込んで結果を返す関数
user, err := getUser()
}
この時、getUser()
の実装パターンとして、値返しのパターンとポインタ返しの2パターンが考えられます。
- ポインタ返しの場合
構造体のコピーは発生しませんが、doSomething()
を大量に呼ぶとGC対象オブジェクトがヒープにたまる。
- 値返しの場合
ヒープにオブジェクトは作成しないが、構造体のコピーが発生するのでポインタ返しより実行がやや遅い?
Goの場合、この使い分けはどこで判断するのがよいでしょうか?