我正在开发具有多个模型(和相关表)的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,如果有帮助的话。
答案 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{}
,您可以通过完成相同的操作轻松制作通用包装器。