• 接口是一种规范与标准,只是规定了要做哪些事情。但是具体怎么做,是实现接口的类去做的,接口只是把所有具有共性的方法定义在一起。
  • 接口存在的意义就是用来定义规范,用来做功能的拓展
  • 接口最大的好处是可以实现多态
  • 在Golang中只要接口中的方法和结构体重的一样,就会认为这么结构体实现了这个接口的方法
  • 在这里还是要吐槽一下,Go的语法是真的丑,如果你是Java转过来的,就会发现,垃圾的一批

接口定义及调用:

定义格式:

tepe 接口名 interface{方法 返回值类型
}

调用格式1:

对象名.方法名

调用格式2:这种方式必须实现接口中声明的所有方法

通过接口变量调用

演示:

func main() {// 对象名.方法名var stu Studentstu.Hello() // Student类实现了接口的Hello方法var tea Teachertea.Hello() // Teacher类实现了接口的Hello方法// 通过接口变量调用,如果接口中有两个方法,但是只实现了一个,就会报错,必须全部实现var testInterface TestInterfacetestInterface = &stutestInterface.Hello() // Student类实现了接口的Hello方法testInterface = &teatestInterface.Hello() // Teacher类实现了接口的Hello方法
}type Student struct{}type Teacher struct{}type TestInterface interface {Hello()
}func (student *Student) Hello() {fmt.Println("Student类实现了接口的Hello方法")
}func (teacher *Teacher) Hello() {fmt.Println("Teacher类实现了接口的Hello方法")
}

多态:

  • 多态是指同一行为,具有多个不同表现形式
  • 多态是一同一个接口,使用不同的实例执行不同的操作
  • 多态是除封装、继承之后面向对象的第三大特征。
  • 多态是出现在接口关系中的(只能是接口)
  • 举例:win电脑和Mac都是电脑(接口),但是mac只能办公用,win可以办公可以玩游戏,不同类型的电脑具有不同的特征,就是多态

多态的实现:

func 函数名 (参数 接口类型){}

演示:

func main() {var stu Studentvar tea Teacher// 多态Polymorphic(&stu) //Student类实现了接口的Hello方法Polymorphic(&tea) // Teacher类实现了接口的Hello方法
}type Student struct{}type Teacher struct{}type TestInterface interface {Hello()
}func (student *Student) Hello() {fmt.Println("Student类实现了接口的Hello方法")
}func (teacher *Teacher) Hello() {fmt.Println("Teacher类实现了接口的Hello方法")
}func Polymorphic(polymorphic TestInterface) {polymorphic.Hello()
}

接口的继承与转换:

接口的继承和普通继承是一样的,直接写接口名就可以了

演示:

func main() {var stu Studentvar test02 TestInterface02test02 = &stutest02.Hello()test02.HelloHello() // 可以调用所继承接口中的方法var test TestInterfacetest = test02test.Hello()
}type Student struct{}type Teacher struct{}type TestInterface interface {Hello()
}type TestInterface02 interface {TestInterface // 继承第一个接口HelloHello()
}func (student *Student) Hello() {fmt.Println("Hello")
}func (student *Student) HelloHello() {fmt.Println("HelloHello")
}

空接口定义及使用:

空接口(interface {})不包含任何的方法,正因为如此,所有的类型都实现了空接口,因此空接口可以存储任意类型的数值

演示:

func main() {// 定义空接口的切片,由于是空接口所以可以存储任意类型的数据var s []interface{}s = append(s, 1, 2, 3, "字符串", 1.1, true)fmt.Println(s)
}

类型断言:

通过类型断言,可以判断空接口中存储的数据类型

定义格式:

value,ok:=m.(T)
  • value:表示变量m的值
  • ok:表示布尔类型变量,如果断言成功为true,否则为false
  • m:表示空接口类型的变量
  • T:表示断言的类型
  • 如果m

演示:

func main() {var i interface{}i = 123// 如果i是int类型就会把结果赋值给ok,把数据(123)赋值给valuevalue, ok := i.(int)// 如果是123就会打印断言成功,不是123就会打印断言失败if ok {fmt.Println("断言成功:", value)} else {fmt.Println("断言失败")}
}

Golang——接口、多态、接口继承与转换、空接口、类型断言相关推荐

  1. C# 类实现接口(Interface) 多态 多继承

    什么是接口 接口在程序中起到规范代码的作用,例如:电脑的USB接口,这些都是已经定义好的了,制造鼠标键盘U盘等厂家就按这种规格做出来的成品在任何电脑上都可以直接使用,而不需要进行适配,这就是规范的使用 ...

  2. java接口和多态应用例题_Java基础进阶 第四天 抽象接口多态

    今日任务: 1,能够独立使用抽象类 2,能够独立使用多态 3,能够独立使用接口 4,能够理解适配器设计模式 1. 抽象类 1.1. 抽象类的产生 需求:创建类描述猫和狗的行为: 猫的行为:抓老鼠:吃鱼 ...

  3. 黑马毕向东Java课程笔记(day07):面向对象(第三部分)继承+抽象类+模板方法设计模式+接口+final+继承补充(就业班)

      在这一部分中,我们将讲解有关继承的相关内容,包括继承的概述.继承的特点.super关键字.函数覆盖.子类的实例化过程.final关键字这几个部分的内容. 1.继承的概述以及特点 1.1.概述    ...

  4. java接口多态的变量能_「JAVA」多态的灵魂,面向接口的程序设计,这才是你该懂得的接口(interface)...

    Java面向对象之接口--interface 什么是接口 一般计算机中的接口分为硬件接口和软件接口. 硬件接口:是指两个硬件设备之间的连接方式,既包括物理上的接口,还包括逻辑上的数据传送协议. 软件接 ...

  5. java学习第八天继承,抽象类,接口

    日期:2019年11月13日 1.子父类中的构造函数的特点: 在子类构造对象时发现,访问子类构造函数时,父类构造函数也运行了.为啥? 答:在子类的构造函数中第一行默认的隐式语句,super(); ** ...

  6. java接口中多继承的问题

    java中支撑多继承吗? 支持->接口啊 为什么接口支持多继承呢?因为接口中没有方法体!即使可能两个接口中有一样的抽象方法,但是 只会调用子类中覆盖该同样抽象方法的具体方法!不会引起调用的歧义! ...

  7. 七:Java之封装、抽象、多态和继承

    本文章介绍了关于Java中的面向对象封装.抽象.继承.多态特点 Java面向对象主要有四大特性:封装.抽象.继承和多态. 一.封装 封装就是将抽象得到的数据和行为(或功能)相结合,形成一个有机的总体, ...

  8. GoLang之interface底层系列二(类型断言)

    文章目录 GoLang之interface底层系列二(类型断言) 1.抽象类型.具体类型 2.断言的作用类型与目标类型 3.空接口.(具体类型) 4.非空接口.(具体类型) 5.空接口.(非空接口) ...

  9. 【Java挠头】继承、抽象、接口、多态、向上转型、向下转型等精妙干货

    –本文摘要–     1.本文的目标读者:是了解Java基础,且对面向对象概念有所了解,但是对Java中继承.抽象类.接口.多态等等概念搞不清的初学者.     2.本文的内容摘要:讲述Java中的一 ...

最新文章

  1. mapreduce工作流程
  2. js ajax 跨域问题 解决方案
  3. 解决Eclipse安装Genymotion插件后抛异常的Bug
  4. 2012-04-26 16:08 Director installer fails with error Unable to run run-cds-tool script“
  5. 1Android系统移植与驱动开发概述
  6. 移动端,fixed bottom问题
  7. NOIP2013普及组 车站分级
  8. 【测试理论基础】史上最强边界值用例设计与实践经验分享
  9. 安装 VS 2015 报错 kb2999226
  10. ibus输入法中添加五笔98输入法
  11. rms 公式 有效值_真有效值RMS定义及推导
  12. 干货分享——CAD动态块
  13. (1366, Incorrect string value: '\\xE6\\xB7\\xB1\\xE5\\x85\\xA5...' for column '
  14. AWS EC2主机类型的区别和联系
  15. volatility取证
  16. R语言计算回归模型R方(R-Squared)实战
  17. PHP是世界上最好语言吗?
  18. SDRAM学习(一)——初始化
  19. 安装golang出现 Hey! The program ‘go‘ is currently not installed. You can install it by typing...
  20. 如何用javaweb实现网上招聘系统、基于SSM+mysql的校园大学生兼职招聘平台

热门文章

  1. php完美导出word,PHP使用phpword生成word文档
  2. linux判断改行符_Linux判断符如何使用?
  3. android手机rom简单制作教程,【图片】ROM助手:任意安卓机型的ROM制作教程【a298t吧】_百度贴吧...
  4. Java 删除集合中指定的元素
  5. execl执行linux命令,execl执行Linux命令
  6. 计算机设计大赛国奖作品_2. 报名材料
  7. 课程设计:基于SQL Server的银行ATM 存取款机系统设计与实现
  8. python函数手册中文_Python中文手册-Python函数
  9. 软件开发报价模板_定制开发小程序和行业通用(模板)小程序的利弊分析
  10. 佳能g2800清零软件天空_可能是史上最有趣的3D建模软件