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.父类接口用于下转型,如果用不带下转型,那么可以不用写上.
最近比较忙,粗略的写了一下,以后再慢慢细化......