Goに限らないトピックかもしれません。

次のような、データベースからデータを読み込む関数(インライン展開されない)を利用する関数があったとします。返されたオブジェクトの生存期間はこの関数内のみとします。

func doSomething() {
    // getUser()はDBから読み込んで結果を返す関数
    user, err := getUser()
}

この時、getUser()の実装パターンとして、値返しのパターンとポインタ返しの2パターンが考えられます。

  • ポインタ返しの場合

構造体のコピーは発生しませんが、doSomething()を大量に呼ぶとGC対象オブジェクトがヒープにたまる。

  • 値返しの場合

ヒープにオブジェクトは作成しないが、構造体のコピーが発生するのでポインタ返しより実行がやや遅い?

Goの場合、この使い分けはどこで判断するのがよいでしょうか?