0

I am trying to create a web project with the julienschmidt/httprouter. I am searching to create a well formatted and well structured project so I have two questions about performances passing and returning value or pointers.
In my case I want to create a function that from the request returns an object so I have created it:

// 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
}

Is it right or it is better to create a store object in the storeController and pass it to the function like:

// 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
}

The other question is about the pointer, is too paranoid to pass and return always pointers instead of object and errors or not?

Willi Mentzel
  • 27,862
  • 20
  • 113
  • 121
jamgas
  • 59
  • 1
  • 6
  • Possible duplicate of [Why should constructor of Go return address?](http://stackoverflow.com/questions/31932822/why-should-constructor-of-go-return-address/31934189#31934189); and [Pointers vs. values in parameters and return values](http://stackoverflow.com/questions/23542989/pointers-vs-values-in-parameters-and-return-values). – icza Nov 26 '16 at 21:08

1 Answers1

1

It's usually redundant and better to eliminate pointless parameters. In fact, by having it as a parameter it's actually initialized to its nil value. Here are all valid ways to do this:

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
}

It's usually best practice to keep local variables local--imagine passing a parameter i to be used in a for loop. Doesn't make much sense, right? So for this situation, I'd recommend options 1 or 3 (which are essentially the same execution) and leave the local variable out of the function signature.

AniSkywalker
  • 449
  • 5
  • 20
  • If I misunderstood the question, basically, pointers are when you need to modify the underlying data and values are when you need the value. – AniSkywalker Nov 27 '16 at 04:11