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

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

  • 相关阅读:
    DateUtil(比较两个日期是否是同一天)
    用过的读写
    小笔记
    日志解析LogParse启动参数配置
    wow经典台词
    Quartz资源收藏
    Quartz Job基本示例
    已知两点坐标,及在从其中一点开始移动的距离,求移动到的坐标
    如何为SUSE配置IP地址,网关和DNS
    详解Linux Initrd
  • 原文地址:https://www.cnblogs.com/miaoliangJUN/p/11892598.html
Copyright © 2020-2023  润新知