2017-06-29 170 views
-1

什麼是「構建」對象的最佳方法。golang:返回指針或傳遞參考

的Leme編寫一些代碼:

type Car struct { 
    Wheels int 
    Doors int 
} 

這車都存儲在某個地方,不知何故。於是我的界面是

func (s Store) GetCar() *Car 

或者我應該讓

func (s Store) GetCar(*Car) 

,並傳遞給一個變量的引用類型?

我正在尋找某種經驗法則。

謝謝!

+3

您是否正在比較像C這樣的語言,其中返回值通常作爲函數參數中的指針傳遞?由於Go具有多個返回值和安全指針轉義分析,因此通常沒有理由這麼做。 – JimB

+1

如果您已經閱讀過任何現有的Go語料庫,您會發現Go中從未使用過「輸出參數」樣式(第二個示例)。 – Adrian

+0

在標準庫中(作爲如何編寫Go代碼的參考),您是否看到過形式爲「func(s Store)GetCar(* Car)」的API?幾乎沒有。這應該回答你的問題。 (對於nitpickers:是的,一些底層函數公開了這樣的API以允許減少分配。) – Volker

回答

2

最常見的方式做到這一點。將它寫成:

func (s Store) GetCar() *Car 

或者,如果你不希望使用指針,你可以不喜歡它:

func (s Store) GetCar() Car 

另一種方法是使GetCar(aCar *Car)可能工作,但它不會那麼清楚,因爲aCar應該被髮送爲空並且然後由函數填充並不明顯。

+0

如果我沒有返回指針,我是不是在內存中有一個重複的空間,因爲我返回一個克隆已經存儲在內存對象中? – jisuskraist

+0

在這種情況下,你會分配兩次內存,是的。但是在你返回之後,函數內部創建的對象將被取消分配,因爲它只是一個局部變量。這對典型情況應該不是問題,但如果您正在分配真正巨大的對象,則可能會影響性能。 – eugenioy

3

去查看引用超出範圍去管理堆/堆棧。所以你可以毫無顧慮地返回指針。

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

好吧,所以傳遞參數作爲參數會更好,如果我有一個接口{}類型,其中idk的結構,即:mgo你傳遞一個引用到你的結構將被填充? (更像是一種泛型方式,你不知道你會返回什麼),或者如果我想做一些實例操作 – jisuskraist

+0

我寫這顯示傳遞引用結構字段的優點(但可能不是一個好的模型)這對Node.Children(3).Parent()等模型很有用。是否通過參考取決於設計。 – mattn