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.父类接口用于下转型,如果用不带下转型,那么可以不用写上.
最近比较忙,粗略的写了一下,以后再慢慢细化......
golang学习--go中'继承'和多态的更多相关文章
- python中继承和多态
继承和多态 继承 引入继承 我们有这样一个需求 模仿英雄联盟定义两个英雄类 1.英雄要有昵称.攻击力.生命值属性 2.实例化出两个英雄对象 3.英雄之间可以互殴,被殴打的一方掉血,血量小于0则判断为死 ...
- [转]Java中继承、多态、重载和重写介绍
什么是多态?它的实现机制是什么呢?重载和重写的区别在那里?这就是这一次我们要回顾的四个十分重要的概念:继承.多态.重载和重写. 继承(inheritance) 简单的说,继承就是在一个现有类型的基础上 ...
- c语言中继承和多态的简单实现
C语言本身是不支持继承和多态的,但其实在 C 的世界里,有一套非常有名的面向对象的框架,用的也非常广,那就是 GObject,它是整个图形界面开发库 GTK 的基石,在IBM developerWor ...
- C#中继承和多态
1.继承的概念 继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用已存在的类的功能. 为了提高软件模块的可复用性和可扩充性,以便提高软件的开发效率,我们总 ...
- Java学习--封装、继承、多态
接下来几天会根据http://www.cnblogs.com/chenssy/category/525010.html中讲解的java内容做个学习笔记,在此感谢一下这位大仙!! 一.封装 对于封装而言 ...
- 0022 Java学习笔记-面向对象-继承、多态、组合
继承的特点 单继承:每个子类最多只有一个直接父类,注意是直接父类,间接父类个数不限 注意父类的概念:A-->B-->C-->D,在这里,ABC都是D的父类,C是D的直接父类,AB是D ...
- Java编程思想学习笔记_2(继承和多态)
静态初始化: 静态初始化只在必要的时刻进行.(即当程序需要加载类进入内存的时候,执行静态初始化.静态变量和静态代码块的初始化顺序,按照在代码中声明的顺序老执行.例如:如果要执行某个public类,那么 ...
- Java中继承与多态
Java类的继承继承的语法结构: [修饰符列表] class 子类名 extends 父类名{ 类体; }子类就是当前这个类,父类就是我们要复用的那个类java中只支持单继承 ...
- python学习日记(继承和多态)
继承 在OOP程序设计中,当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类.父类或超类(Base class.S ...
随机推荐
- C# 表达式树 Expression
表达式树是定义代码的数据结构. 它们基于编译器用于分析代码和生成已编译输出的相同结构. 几种常见的表达式 BinaryExpression 包含二元运算符的表达式 BinaryExpression b ...
- URL百分号编码
百分号编码是什么! 百分号编码(Percent-Encoding)也被称为 URL 编码,是一种编码机制.该机制主要应用于 URI 编码中,URI 包含 URL 和 URN,所以它们也同样适用.除此之 ...
- SpirngCloud之Ribbon负载均衡(二)
一 概念 Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端 负载均衡的工具. 简单的说,Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负 ...
- Tomcat项目部署
一 之前一直是在ecplise 利用tomcat插件的形式启动项目,这里可以通过选择server.xml和context files两种方式这里选择这两者方式,都是会在tomcat/bin下产生对应的 ...
- MIT线性代数:12.图和网络
- WebGL简易教程(十二):包围球与投影
目录 1. 概述 2. 实现详解 3. 具体代码 4. 参考 1. 概述 在之前的教程中,都是通过物体的包围盒来设置模型视图投影矩阵(MVP矩阵),来确定物体合适的位置的.但是在很多情况下,使用包围盒 ...
- web中间件常见漏洞总结笔记
之前看吐司别人发的个文档,简单记的笔记 ----- IIS 解析漏洞 IIS 6 *.asp;.jpg会被当作asp解析 *.asp/ ...
- 短期Flag
十一我不想放假,我想成为那10个被拉出去去南方虐的人之一. 然而我现在,最近考得连能不能稳在之留下10个人的第一机房都有点悬. 最近的问题都无法解决,这个短期flag我也不想让它倒啊! 所以,Deep ...
- NOIP模拟 1
NOIP模拟1,到现在时间已经比较长了.. 那天是6.14,今天7.18了 //然鹅我看着最前边缺失的模拟1,还是终于忍不住把它补上,为了保持顺序2345重新发布了一遍.. # 用 户 名 ...
- call 与apply深入
http://blog.csdn.net/bao19901210/article/details/21614761