2016-11-26 59 views
0

我是golang的新手,我試圖用julienschmidt/httprouter創建一個web項目。我正在尋找創建一個格式良好,結構良好的項目,所以我有兩個關於表演傳球和返回價值或指針的問題。
在我來說,我希望創建一個從請求返回一個對象的功能,所以我已經創造了它:Golang - 傳遞和返回變量的最佳實踐

// StoreController 
func (storeController *StoreController) New(w http.ResponseWriter, r *http.Request) { 
    store, err := utilities.GetStoreFromRequest(r) 
    // other stuff 
    return 
} 

// Utilities package 
func GetStoreFromRequest(r *http.Request) (*models.Store, error) { 
    store := models.Store{} 
    err := json.NewDecoder(r.Body).Decode(&store) 
    // return a pointer is better than returning an object? 
    return &store, err 
} 

是正確或最好是在storeController創建一個存儲對象,並把它傳遞給像功能:

// StoreController 
func (storeController *StoreController) New(w http.ResponseWriter, r *http.Request) { 
    store := models.Store{} 
    err := utilities.GetStoreFromRequest(r, &store) 
    // other stuff 
    return 
} 

// Utilities package 
func GetStoreFromRequest(r *http.Request, store *models.Store) error { 
    err := json.NewDecoder(r.Body).Decode(store) 
    return err 
} 

另一個問題是關於指針,太偏執地傳遞和返回總是指針而不是對象,錯誤或不? 謝謝

+0

可能重複[爲什麼應該返回地址的構造函數?](http://stackoverflow.com/questions/31932822/why-should-constructor-of-go-return-address/31934189#31934189);和[指針與參數和返回值中的值](http://stackoverflow.com/questions/23542989/pointers-vs-values-in-parameters-and-return-values)。 – icza

回答

1

它通常是多餘的,更好地消除無意義的參數。事實上,通過將它作爲參數實際初始化爲零值。這裏是所有有效的方式來做到這一點:

func GetStoreFromRequest(r *http.Request) (store *models.Store, err error) { 
    err = json.NewDecoder(r.Body).Decode(store) 
    return 
} 

func GetStoreFromRequest(r *http.Request, store *models.Store) error { 
    err := json.NewDecoder(r.Body).Decode(store) 
    return err 
} 

func GetStoreFromRequest(r *http.Request) (*models.Store, error) { 
    var store models.Store // or store := models.Store{} 
    err = json.NewDecoder(r.Body).Decode(&store) 
    return &store, err 
} 

它通常是保持局部變量當地最好的做法 - 想象路過我要被用在for循環的參數。沒有多大意義,對嗎?所以對於這種情況,我推薦選項1或3(基本上是相同的執行),並將局部變量保留在函數簽名之外。

+0

如果我誤解了這個問題,基本上,指針是當你需要修改底層數據和值時,你需要的價值。 – AniSkywalker