我是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
}
另一个问题是关于指针,是否过于偏执传递并返回总是指针而不是对象和错误? 感谢
答案 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(基本上是相同的执行)并将局部变量保留在函数签名之外。