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

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

  • 相关阅读:
    Android之在linux终端执行shell脚本直接打印当前运行app的日志
    webpack打包vue项目之后生成的dist文件该怎么启动运行
    Android工程中javax annotation Nullable找不到的替代方案
    绝对良心提供百度网盘的jdk1.8源码下载包含sun包的
    上周热点回顾(12.23-12.29)团队
    上周热点回顾(12.16-12.22)团队
    k8s 开船记:升级为豪华邮轮(高可用集群)与遇到奇怪故障(dns解析异常)团队
    上周热点回顾(12.9-12.15)团队
    k8s 开船记-修船:改 readinessProbe ,去 DaemonSet ,上 Autoscaler团队
    k8s 开船记-触礁:四涡轮发动机撞坏3个引发502故障团队
  • 原文地址:https://www.cnblogs.com/miaoliangJUN/p/11892598.html
Copyright © 2011-2022 走看看