【问题标题】:Golang - best practices to pass and return variablesGolang - 传递和返回变量的最佳实践
【发布时间】:2016-11-26 20:20:19
【问题描述】:

我是 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
}

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

【问题讨论】:

标签: performance function pointers go


【解决方案1】:

消除无意义的参数通常是多余的并且更好。事实上,通过将它作为参数,它实际上被初始化为它的 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
}

将局部变量保持在本地通常是最佳实践——想象传递一个参数 i 以在 for 循环中使用。没有多大意义,对吧?所以对于这种情况,我推荐选项 1 或 3(它们本质上是相同的执行),并将局部变量留在函数签名之外。

【讨论】:

  • 如果我误解了这个问题,基本上,指针是你需要修改底层数据的时候,值是你需要值的时候。
猜你喜欢
  • 2021-11-14
  • 2019-07-12
  • 2012-07-27
  • 1970-01-01
  • 1970-01-01
  • 2013-05-13
  • 1970-01-01
  • 1970-01-01
  • 2018-10-22
相关资源
最近更新 更多