2017-06-29 2 views
-1

オブジェクトを "ビルド"する最良の方法は何ですか?golang:ポインタを返すか参照を渡す

レメにはいくつかのコードを記述します。

type Car struct { 
    Wheels int 
    Doors int 
} 

この車は何らかの形で、どこかに保存されています。だから私のインターフェイスは、

func (s Store) GetCar() *Car 

のタイプのものでなければならないか、私はそれ

func (s Store) GetCar(*Car) 

作り、変数への参照を渡す必要がありますか?

私はある種の経験則を探しています。

ありがとうございます!

+3

Cのような戻り値が関数引数のポインタとして渡されることが多い言語と比較していますか? Goには複数の戻り値と安全なポインタエスケープ解析があるので、通常これを行う理由はありません。 – JimB

+1

利用可能な既存のGoコーパスを読んだら、「出力パラメータ」スタイル(2番目の例)がGoでは使用されないことがわかります。 – Adrian

+0

標準ライブラリ(Goコードの記述方法のリファレンスとして)では、 'func(Store)GetCar(* Car)'という形式のAPIを見ましたか?ほとんどどこにもない。それはあなたの質問に答えるはずです。 (nitpickersについて:はい、いくつかの低レベル関数は、割り当てを減らすためにそのようなAPIを公開しています。) – Volker

答えて

2

としてそれを書くことであろうことを行うための最も一般的な方法:あなたは、ポインタを使用しない場合は、

func (s Store) GetCar() *Car 

それとも、あなたはそれが好き行うことができます。

func (s Store) GetCar() Car 

もう1つの方法は、GetCar(aCar *Car)にすることもできますが、aCarを空にしてから関数に入力する必要があることは明らかではないため、明確ではありません。

+0

私はポインタを返さない場合、私はメモリの複製を返すので、すでにメモリオブジェクトに格納されていますか? – jisuskraist

+0

この場合、メモリを2回割り当てることになります。しかし、あなたが戻った直後に、関数内で作成されたオブジェクトは、それが単なるローカル変数だったので、割り当て解除されます。これは典型的なケースでは問題ではありませんが、実際に巨大なオブジェクトを割り当てる場合はパフォーマンスに影響する可能性があります。 – eugenioy

3

参照が範囲外になるのを見ながらヒープ/スタックを管理してください。だから、心配することなくポインタを返すことができます。

func (s *Store) GetCar() *Car { 
    return &Car{Store: s} 
} 
+0

だから、もし私がインターフェイス{}型のidk構造体を持っていれば、パラメータとして参照を渡す方が良いでしょう。すなわち、構造体への参照を渡す場所はどこですか? (あなたが何を返すのかわからないジェネリックスのようなもの)またはインスタンス操作をいくつか行いたい場合は – jisuskraist

+0

構造体フィールドへの参照を渡すメリットを示すためにこれを書いています(しかしこれは良いモデルではないかもしれません)これはNode.Children(3).Parent()のようなモデルに便利です。参照を渡すかどうかは、設計に依存します。 – mattn

関連する問題