亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何為在golang中具有一個公共字段的不同結構添加一種方法

如何為在golang中具有一個公共字段的不同結構添加一種方法

Go
瀟瀟雨雨 2021-11-22 15:27:36
我正在為我的應用程序使用 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}
查看完整描述

2 回答

?
犯罪嫌疑人X

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()那么我可能沒有充分利用該功能。


查看完整回答
反對 回復 2021-11-22
?
繁花如伊

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”會恐慌


查看完整回答
反對 回復 2021-11-22
  • 2 回答
  • 0 關注
  • 190 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號