首页 > 其他 > 详细

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

时间:2019-11-19 23:16:19      阅读:112      评论:0      收藏:0      [点我收藏+]

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

 

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

 

 

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

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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!