去防止重复
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{}
,您可以通过做完全相同的事情轻松制作通用包装器。
我正在开发将具有多个模型(和相关表)的网络应用程序,它们显然将具有许多相似的方法,唯一的区别将是返回的结果类型。
示例:
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{}
,您可以通过做完全相同的事情轻松制作通用包装器。