Go 语言接口

Go 语言提供了另外一种数据类型即接口,它把所有的具有共性的方法定义在一起,任何其他类型只要实现了这些方法就是实现了这个接口。

实例

/* 定义接口 */
type interface_name interface {
method_name1 [return_type]
method_name2 [return_type]
method_name3 [return_type]
...
method_namen [return_type]
} /* 定义结构体 */
type struct_name struct {
/* variables */
} /* 实现接口方法 */
func (struct_name_variable struct_name) method_name1() [return_type] {
/* 方法实现 */
}
...
func (struct_name_variable struct_name) method_namen() [return_type] {
/* 方法实现*/
}

a、定义多个结构体

b、为每个结构体定义一个相同的方法,比如我们下面的事例,Say

c、定义一个接口,这个接口的内容就是步骤b定义的Say()方法

d、在定义一个函数,这个函数,这个函数的参数类型就是步骤c定义的接口

e、调用步骤d的函数,传递一个步骤b定义的结构体进去 就实现了多态

1、go语言的多态是用接口来实现的interface

package main

import "fmt"

//面向对象的多态是通过接口interface来实现的,不同的对象,调用相同的接口,实现不同的效果

//go语言中,接口interface是一个自定义类型,描述了一系列方法的集合,关键字interface
//接口不能被实例化 //定义接口的方法
//type 接口名字 interface {
//
//} //接口的名字一般以er结尾 //定义一个Personer的接口
type Personer interface {
Say()
} //定义一个学生的结构体 type Studentxxx struct {
name string
score int
} type Teacherxxx struct {
name string
class string
} func (s *Studentxxx) Say () {
fmt.Println(s.name,s.score)
} func (s *Teacherxxx) Say () {
fmt.Println(s.name,s.class)
} type Mystring string func (m Mystring) Say () {
fmt.Println("自定义标准类型")
} //go语言的多态来实现
func Whosay(i Personer) {
i.Say()
} func main() {
sxxxx := &Studentxxx{name:"张三",score:12}
txxxx := &Teacherxxx{name:"李四",class:"一年级"} var my Mystring = "ABC" sxxxx.Say()
txxxx.Say()
my.Say()
//张三 12
//李四 一年级
//自定义标准类型 //go语言实现多态
Whosay(sxxxx)
Whosay(txxxx)
Whosay(my) //张三 12
//李四 一年级
//自定义标准类型 //练习一下make,创建一个数组
x := make([]Personer,3) x[0],x[1],x[2] = sxxxx,txxxx,my
for _,value := range x {
value.Say()
}
//张三 12
//李四 一年级
//自定义标准类型
}

  

2、interface接口实现继承

//定义一个Personer的接口
type Personer interface {
Say()
} //接口也可以继承,我们这里写了一个Personer1的接口,这个接口继承Personer这个接口,也就是说Personer1
//这个接口也有Say这个方法了,我们同样也为Personer1这个接口定义了自己的方法,Run()
type Personer1 interface {
Personer
Run()
}

  

定义了结构体

type Personxxxx struct {
name string
class string
age int
}

  

定义一个函数

//go语言的多态来实现
func Whosay(i Personer) {
i.Say()
}

  

为继承的接口定义方法

func (s2 *Personxxxx) Say()  {
fmt.Println("接口的继承测试1")
} func (s2 *Personxxxx) Run() {
fmt.Println("接口的继承测试2")
}

  

	p2 := &Personxxxx{name:"p2222",class:"二年级",age:12}

	p2.Say()
p2.Run()
//接口的继承测试1
//接口的继承测试2 Whosay(p2)
//接口的继承测试1

  

3、if格式的类型判断

package main

import (
"fmt"
) //接口类型判断 //定义一个空接口
type Niler interface {
} type PersonTest struct {
name string
age int } func main() {
//定义一个接口类型的切片
list := make([] Niler,3)
list[0] = 1
list[1] = "hello"
list[2] = PersonTest{name:"erBi",age:12} for k,v := range list {
//类型断言,返回的两个参数,一个是value,一个是ok,value是变量的值,ok是返回的布尔值
//comma-ok断言
//这里的例子就是通过上面的返回值v来判断v的类型,如果v的类型为int。则ok为true
_,ok := v.(int)
if ok {
fmt.Println(k,v,"数字")
} else if _,ok := v.(string);ok{
fmt.Println(k,v,"字符串")
} else if value,ok := v.(PersonTest);ok {
fmt.Println(value.name,"结构体")
} else {
fmt.Println("错误的数据类型")
}
}
//0 1 数字
//1 hello 字符串
//erBi 结构体
}

  

4、switch的类型判断

go面向对象之多态即接口(interface)的更多相关文章

  1. 【Java基础】【09面向对象_多态&抽象类&接口】

    09.01_面向对象(多态的概述及其代码体现) A:多态(polymorphic)概述 事物存在的多种形态 B:多态前提 a:要有继承关系. b:要有方法重写. c:要有父类引用指向子类对象. C:案 ...

  2. JavaSE入门学习21:Java面向对象之接口(interface)(二)

    一接口实现的多态 在上一篇博文:JavaSE入门学习20:Java面向对象之接口(interface)(一)中提到了接口的实现存在多态性,那么 这一篇主要就要分析接口实现的多态. 实例一 Test.j ...

  3. java 面向对象面试题,问答题,构造方法,抽象类,继承,多态,接口,异常总结;

    一,构造方法的特点 面向对象的思想是如何在java展现的呢? 就是通过类和对象 类是一组相关的属性和行为的集合.是一个抽象的概念. 对象是该类事物的具体表现形式.具体存在的个体. 一.抽象类的抽象方法 ...

  4. Java 基础 面向对象: 接口(interface )概念 以及接口之练习3 -定义一个接口用来实现两个对象的比较并 判断instanceof是否为同类

    接口(interface )概念概念笔记 及测试代码: /** 面向对象: 接口(interface ) 是与类并行的一个概念: * 1.接口可以看成一个特殊的抽象类,它是常量与抽象方法的一个集合 * ...

  5. java:面向对象(多态,final,抽象方法,(简单工厂模式即静态方法模式),接口)

    * 生活中的多态:同一种物质,因环境不同而表现不同的形态. * 程序中多态:同一个"接口",因不同的实现而执行不同的操作. * 多态和方法的重写经常结合使用,子类重写父类的方法,将 ...

  6. 面向对象-接口(interface)实战案例

    面向对象-接口(interface)实战案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.接口(interface)概述 1>.接口的语法格式 接口时抽象类的一种特殊体 ...

  7. PHP面向对象程序设计之接口(interface)

    接口(interface)是抽象方法和静态常量定义的集合.接口是一种特殊的抽象类,这种抽象类中只包含抽象方法和静态常量. 为什么说接口是一种特殊的抽象类呢?如果一个抽象类里面的所有的方法都是抽象方法, ...

  8. c#中抽象类(abstract)和接口(interface)的相同点与区别

    相同点: 1.都可以被继承 2.都不能被实例化 3.都可以包含方法声明 4.派生类必须实现未实现的方法 区别: 1.抽象基类可以定义字段.属性.方法实现.接口只能定义属性.索引器.事件.和方法声明,不 ...

  9. Java面向对象之多态(来源于身边的案例)

    2019年1月3日 星期四 Java面向对象之多态(来源于身边的案例) 1. 为什么要用多态? 1.1 多态是面向对象的三大特性之一 1.2 多态是基于接口设计的模型 1.3 多态具有横向扩展特性 1 ...

随机推荐

  1. 3年Java开发10面阿里、京东、拼多多

    拼多多 地点:2号线娄山关路地铁站(金虹桥国际中心) 环境:新的写字楼,环境很好,有种高大上的感觉.大厅进入后需要登记,然后进闸机.电梯是需要刷卡才能使用的.会议室都是用城市名称命名,例如杭州.香港等 ...

  2. VMware Centos中创建克隆虚拟机导致网卡设备无法启动的问题

    一.前言 在创建克隆虚拟机的时候,如果样板虚拟机没有事先配置好,则会导致网卡设备无法启动的问题(报错如下). Bringing up interface eth0: Device eth0 does ...

  3. 《Java算法》贪心算法

    贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择.也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解. 贪心算法的经典案例: 跳跃游戏: 给定一个非负整 ...

  4. SpringBoot电商项目实战 — 商品的SPU/SKU实现

    最近事情有点多,所以系列文章已停止好多天了.今天我们继续Springboot电商项目实战系列文章.到目前为止,整个项目的架构和基础服务已经全部实现,分布式锁也已经讲过了.那么,现在应该到数据库设计及代 ...

  5. 优先队列与TopK

    一.简介 前文介绍了<最大堆>的实现,本章节在最大堆的基础上实现一个简单的优先队列.优先队列的实现本身没什么难度,所以本文我们从优先队列的场景出发介绍topK问题. 后面会持续更新数据结构 ...

  6. windows cmd 生成文件目录树

    一.背景 之前逛GitHub的时候看到有大佬在描述项目结构的时候使用了一种文件目录树的格式 │ └─student_information_management_system │ │ ├─build ...

  7. Java题库——Chapter17 二进制I/0

    Introduction to Java Programming 的最后一章,完结撒花!Chapter 17 Binary I/O Section 17.2 How is I/O Handled in ...

  8. angular8 导出excel文件

    angular package 1.xlsx npm install xlsx --save 2.file-saver npm install file-saver --save npm instal ...

  9. Could not find any version that matches com.android.support:appcompat-v7:29.+

    新学Android开发设计用到Android Studio,说实话真的是BUG满天飞,稍有不慎就会蹦出一个不明所以的问题. 新建Android工程时编译运行报错: 目测是本地文件和工程对应的依赖包不匹 ...

  10. Hadoop_MapReduce_03

    1. MapReduce入门 1.1 MapReduce的思想 MapReduce的思想核心是"分而治之" , 适用于大量的复杂的任务处理场景 (大规模数据处理场景) . Map负 ...