我正在开发将具有多个模型(和相关表)的网络应用程序,并且它们显然将具有许多相似的方法,唯一的区别将是返回的结果类型。
例子:
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/