去防止重复

标签 go beego

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

例子:

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
}

还有很多很多...

在 Controller 等中,我正在使用它:

user := models.GetUser(id)

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

PS:我用的是Beego Framework ,如果有帮助的话。

最佳答案

将模型作为接口(interface)传入,并期望函数填充它。无需返回。基本上,您几乎完全遵循 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 的任何模型。它会填充您传入的模型,除非它返回一个错误

所以用法如下:

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){},您可以通过执行完全相同的操作轻松制作通用包装器。

关于去防止重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46104145/

相关文章:

go - 如何在grpc服务器端使用从客户端传递过来的上下文

azure - K8S - 获取配置 map 数据问题

api - golang 缺少 len 参数

go - Beego orm - 关系不起作用

go - 错误。is(...)不对称❓

regex - 正则表达式匹配网址路径-Golang与Gorilla Mux

go - 相当于go中python的ord()、chr()?

go - 如何在 Beego 中使用 gorm

Go Channel读写卡死循环