2016-11-26 55 views
0

我是golang的新手,我试图用julienschmidt/httprouter创建一个web项目。我正在寻找创建一个格式良好,结构良好的项目,所以我有两个关于表演传球和返回价值或指针的问题。
在我来说,我希望创建一个从请求返回一个对象的功能,所以我已经创造了它: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

它通常是多余的,更好地消除无意义的参数。事实上,通过将它作为参数实际初始化为零值。这里是所有有效的方式来做到这一点:

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循环的参数。没有多大意义,对吗?所以对于这种情况,我推荐选项1或3(基本上是相同的执行),并将局部变量保留在函数签名之外。

+0

如果我误解了这个问题,基本上,指针是当你需要修改底层数据和值时,你需要的价值。 – AniSkywalker