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

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

  • 相关阅读:
    DataGridView单元格内容自动匹配下拉显示
    C#中datagridviewz中SelectionMode的四个属性的含义
    Visual Studio效率神器——超级扩展ReSharper安装和破解
    vue优化(1) vuecli3/4 【图片压缩 】||【文件压缩】
    DownValues, UpValues, SubValues, 和OwnValues之间的区别?
    Leonid Shifrin 的书
    python newbie——蒙特卡罗法计算圆周率
    python newbie——PE No.1
    指尖上的数学
    瞎猫碰到死耗子
  • 原文地址:https://www.cnblogs.com/miaoliangJUN/p/11892598.html
Copyright © 2011-2022 走看看