我是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中创建一个store对象,并将其传递给以下函数:
// 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
}
另一个问题是关于指针的问题,是否过于偏执而无法传递和返回始终是指针而不是对象和错误的指针?谢谢
通常是多余的,最好消除无意义的参数。实际上,通过将其作为参数,实际上已将其初始化为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
}
通常最好的做法是将局部变量保持局部状态-想象传递一个要在for循环中使用的参数i。没什么意义吧?因此,对于这种情况,我建议使用选项1或3(本质上是相同的执行方式),并将局部变量保留在函数签名之外。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句