golang中沒有繼承的概念,這個struct屬性上的繼承,但是可以用匿名字段來模擬這個過程,方法上面的繼承要使用接口.多態可以通過接口實現.可以看一下代碼.
package main import ( "encoding/json" "fmt" ) //抽象接口 type ISubUser interface { Delete() string Get() string } type User struct { Lang string `json:"lang" gorm:"type:varchar(16)"` // 語言類型 ISubUser `json:"-"` } type PermanentUser struct{ Key uint64 `json:"key123" gorm:"primary_key"` // 主鍵:索引 User } func (paste *PermanentUser) Delete() string { return "PermanentUser is Delete" //return db.Delete(&paste, "`key` = ?", paste.Key).Error } // 成員函數,訪問 func (paste *PermanentUser) Get() string { return "PermanentUser is Get" //return db.Find(&paste, "`key` = ?", paste.Key).Error } type TemporaryUser struct{ Key uint64 `json:"key456" gorm:"primary_key"` // 主鍵:索引 User } // 成員函數,刪除 func (paste *TemporaryUser) Delete() string { return "TemporaryUser is Delete" //return db.Delete(&paste, "`key` = ?", paste.Key).Error } // 成員函數,查看 func (paste *TemporaryUser) Get() string { return "TemporaryUser is Get" //return db.Find(&paste, "`key` = ?", paste.Key).Error } func testGetPolymorphism(u ISubUser){ fmt.Println(u.Get()) } func testDetelePolymorphism(u ISubUser) { fmt.Println(u.Delete()) } func main(){ //繼承 Puser:=&PermanentUser{Key:123,User:User{Lang:"asd"}} jsonstring,_:=json.Marshal(Puser) fmt.Println(string(jsonstring)) fmt.Println() Tuser:=&TemporaryUser{Key:456,User:User{Lang:"zxc"}} jsonstring,_=json.Marshal(Tuser) fmt.Println(string(jsonstring)) fmt.Println("-------------------------") //多態--上轉型 testGetPolymorphism(Puser) testDetelePolymorphism(Puser) testGetPolymorphism(Tuser) testDetelePolymorphism(Tuser) fmt.Println("----------------------") //多態--下轉型 user:=&User{Lang:"asd"} user.ISubUser=&PermanentUser{} fmt.Println(user.Get()) fmt.Println(user.Delete()) jsonstring,_=json.Marshal(user) fmt.Println(string(jsonstring)) fmt.Println() user.ISubUser=&TemporaryUser{} fmt.Println(user.Get()) fmt.Println(user.Delete()) jsonstring,_=json.Marshal(user) fmt.Println(string(jsonstring)) fmt.Println() }
有幾點需要說明的
1.初始化的時候一定要指明變量屬性的字段,不然編譯不通過,會一直說什么參數過少.
2.父類所帶接口要記得`json:"-"`,這樣在轉換從json的時候不會帶着接口
3.父類接口用於下轉型,如果用不帶下轉型,那么可以不用寫上.
最近比較忙,粗略的寫了一下,以后再慢慢細化......
