防止重复

时间:2017-09-07 19:57:32

标签: go beego

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

示例:

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,如果有帮助的话。

1 个答案:

答案 0 :(得分:3)

将模型作为接口传递,并期望函数填充它。无需退货。基本上你几乎遵循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创建任何模型。它会填充您传入的模型,除非它返回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{},您可以通过完成相同的操作轻松制作通用包装器。