如何为在golang中具有一个公共字段的不同结构添加一种方法

我正在为我的应用程序使用 beego/orm。这里我有 2 个模型


type ModelA struct {

    Guid string `orm:"pk"`

    FiledA string

}


type ModelB struct {

    Guid string `orm:"pk"`

    FiledB string

}

我需要Save()为每个结构添加一个方法。通常,我可以创建一个Base结构并将其混合到ModelAand 中ModelB,但是 orm 不起作用。


有没有更好的解决办法?


编辑1: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

}



潇潇雨雨
浏览 171回答 2
2回答

犯罪嫌疑人X

是的。定义一个接口。另外,讨厌吹毛求疵,虽然我很确定你在谈论嵌入,但 Go 中不存在“混合”概念。这是一些演示构造的伪代码。type Savable interface {       Save()}// satisfies Savable for ModelAfunc (a ModelA) Save() {      // do something}var i Savablei = 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()那么我可能没有充分利用该功能。

繁花如伊

不,你不能这样做,因为 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”会恐慌
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go