2016-11-26 7 views
0

私はgolangを初めて使っています。私はjulienschmidt/httprouterを使ってWebプロジェクトを作成しようとしています。私はよくフォーマットされた、よく構造化されたプロジェクトを作りたいと思っていますので、パフォーマンスやポインタを返すパフォーマンスについて2つの質問があります。私はそれを作成しているので、私の場合は
は私がリクエストからオブジェクトを返す関数を作成したい: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

無意味なパラメータを排除することは通常は冗長であり、より良い方法です。実際、それをパラメータとして持つことで、実際にはnil値に初期化されます。ここでこれを行うには、すべての有効な方法があります。

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 
} 

それは通常、地元のローカル変数を維持するためのベストプラクティスだ - 私はループで使用するパラメータを渡すことを想像してみてください。あまり意味がありませんよね?だから、この状況では、私はオプション1または3(本質的に同じ実行である)をお勧めし、ローカル変数を関数シグネチャから除外します。

+0

私がこの質問を誤解した場合、基本的にポインタとは、基礎となるデータを変更する必要があり、値が必要なときです。 – AniSkywalker

関連する問題