【发布时间】:2022-06-13 20:35:14
【问题描述】:
我正在为我的应用程序使用 beego/orm。这里我有 2 个模型
type ModelA struct {
Guid string `orm:"pk"`
FiledA string
}
type ModelB struct {
Guid string `orm:"pk"`
FiledB string
}
我需要为每个结构添加一个Save() 方法。一般来说,我可以创建一个Base 结构并将其混入ModelA 和ModelB,但orm 不起作用。
有没有更好的解决方案?
edit1:在此处提供Save() 代码以使问题更清晰
func (this *ModelA) Save() error {
o := orm.NewOrm()
guid := guidlib.Generate()
this.Guid = guid
_, err := o.Insert(this)
return err
}
func (this *ModelB) Save() error {
o := orm.NewOrm()
guid := guidlib.Generate()
this.Guid = guid
_, err := o.Insert(this)
return err
}
【问题讨论】:
-
我对beego/orm不是很熟悉,但是你不能在嵌入式结构上放置标签有什么原因吗?我仍然不确定这是否会真正帮助您,因为在该嵌入式结构上运行的方法将无法访问外部结构的任何其他字段。就而言
-
@AndrewN,所以在
func (this *Base) Save()方法中,this变量总是指向Base,即使在ModelA实例上调用它?也许基本解决方案是错误的方式。为了让问题更清楚,我添加了Save()方法的实现。 -
正确。不过,
this在 Go 中并不是很惯用。如果逻辑确实完全相同相同,请将 Save 函数设为非方法,然后调用对象(通过接口)。让我看看我是否可以举个例子,我会把它作为答案发布,因为我正在超越 cmets... -
Here 是一个非常简单的示例,使用接口编写您的
Save逻辑一次。 -
@AndrewN,谢谢。如果
interface可以包含数据字段,比如type IDer interface { ID string },代码会更简单漂亮。