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 關注
- 190 瀏覽
添加回答
舉報