Golang - 传递和返回变量的最佳实践

时间:2016-11-26 20:20:19

标签: performance function pointers go

我是Golang的新手,我正在尝试使用julienschmidt / httprouter创建一个Web项目。我正在寻找创建一个格式良好且结构良好的项目,所以我有两个关于表演传递和返回值或指针的问题 在我的情况下,我想创建一个函数,从请求返回一个对象,所以我创建了它:

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

另一个问题是关于指针,是否过于偏执传递并返回总是指针而不是对象和错误? 感谢

1 个答案:

答案 0 :(得分: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
}

将局部变量保持为局部通常是最好的做法 - 想象一下将参数i传递给for循环。没有多大意义,对吗?因此,对于这种情况,我建议选项1或3(基本上是相同的执行)并将局部变量保留在函数签名之外。