去防止重复

Go prevent repetition

我正在开发将具有多个模型(和相关表)的网络应用程序,它们显然将具有许多相似的方法,唯一的区别将是返回的结果类型。

示例:

package models
type User struct {...}
type Task struct {...}

func GetUser(uid string) (*User, error) {
  user := User{Id: id}
  if err := ORM.Read(&user); err != nil {
      return nil, err
  }
  return &user, nil
}

func GetTask(uid string) (*Task, error) {
  task := Task{Id: id}
  if err := ORM.Read(&task); err != nil {
      return nil, err
  }
  return &task, nil
}

还有很多很多...

在控制器等中,我正在使用它:

user := models.GetUser(id)

我不太确定如何在 Golang 中解决这个问题,有什么建议吗?

PS:如果有帮助,我正在使用 Beego Framework

将模型作为接口传入,并期望函数填充它。不需要 return 它。基本上,您几乎完全遵循 ORM.Read 所做的范例。

// GetByID loads the model for dst's concrete type based on its Id field using ORM.Read
func GetByID(dst interface{}) error {
    if err := ORM.Read(dst); err != nil {
        return nil, err
    }
    return nil
}

此函数要求您使用已设置的 ID 创建您获得的任何模型。它会填充您传入的模型,除非它 return 是 error.

所以用法如下:

user := User{Id: id}
err := GetByID(&user)
if err != nil {
    // handle error. model not populated
}
// user is ready to use

task := Task{Id: id}
err = GetByID(&task)
...

作为以后的注意事项,当您再次 运行 遇到这种情况时,请记下您正在调用的库的函数类型。通常,如果需要这样的 interface{},您可以通过做完全相同的事情轻松制作通用包装器。