golang学习--go中'继承'和多态

  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.父类接口用于下转型,如果用不带下转型,那么可以不用写上.

最近比较忙,粗略的写了一下,以后再慢慢细化......

原文地址:https://www.cnblogs.com/miaoliangJUN/p/11892598.html