2 回答
TA贡献2080条经验 获得超4个赞
是的。定义一个接口。另外,讨厌吹毛求疵,虽然我很确定你在谈论嵌入,但 Go 中不存在“混合”概念。这是一些演示构造的伪代码。
type Savable interface {
Save()
}
// satisfies Savable for ModelA
func (a ModelA) Save() {
// do something
}
var i Savable
i = SomeMethodThatRetunsMyModel()
i.Save()
SomeOthermMethodThatAcceptsASavableAndCallesSave(i)
编辑:根据一些讨论,OP 可能想要做类似下面的事情
type ModelA struct {
ModelC
FiledA string
}
type ModelB struct {
ModelC
FiledB string
}
type ModelC struct {
Guid string `orm:"pk"`
}
func (this ModelC) Save() error {
o := orm.NewOrm()
guid := guidlib.Generate()
this.Guid = guid
_, err := o.Insert(this)
return err
}
但是,请注意,o.Insert(this)不会插入任何未在 上定义的字段ModelC。正如我在下面的评论中提到的,在模型 A 和 B 重新实现Save预先调用基类方法的情况下可能使用的继承结构类型在 Go 中并不能很好地工作。
嵌入类型的方法解析规则并不完全清楚,可能会令人困惑。您可以Save在嵌入式结构中定义一个版本,在嵌入器中重新定义它,甚至在该方法中调用它,但是这样做并没有多大意义。如果您仍然必须静态引用嵌入类型,我会指出避免嵌入。例如,如果我有ModelA嵌入ModelC并且在更广泛的范围内我必须这样做,ModelA.ModelC.SomeMethodThatIhaveToReferencExplicitlyToEnsureItsCalled()那么我可能没有充分利用该功能。
TA贡献2012条经验 获得超12个赞
不,你不能这样做,因为 golang 不支持继承。但是您可以执行以下操作:
func Save(obj interface{}) error {
o := orm.NewOrm()
guid := guidlib.Generate()
r := reflect.ValueOf(obj)
f := reflect.Indirect(r).FieldByName("Guid")
f.setString(guid)
_, err := o.Insert(obj)
return err
}
小心,如果没有字段“guid”会恐慌
- 2 回答
- 0 关注
- 155 浏览
添加回答
举报