【Go】十五、接口、多态、断言

文章目录

  • 1、接口的引入
  • 2、接口
  • 3、接口的注意点
  • 4、多态
  • 5、断言
  • 6、Type Switch

1、接口的引入

以日常生活中打招呼为例,定义接口规范,各国人为打招呼为具体的实现

package main
import "fmt"//接口的定义:定义规则、定义规范,定义某种能力:
type SayHello interface{//声明没有实现的方法:sayHello()
}=========================================分割线
//接口的实现:定义一个结构体:
//中国人:
type Chinese struct{
}
//实现接口的方法---》具体的实现:
func (person Chinese) sayHello(){fmt.Println("你好")
}=========================================分割线//接口的实现:定义一个结构体:
//美国人:
type American struct{
}
//实现接口的方法---》具体的实现:
func (person American) sayHello(){fmt.Println("hi")
}=========================================分割线//定义一个函数:专门用来各国人打招呼的函数,接收具备SayHello接口的能力的变量:
func greet(s SayHello){s.sayHello()
}
=========================================分割线//测试
func main(){//创建一个中国人:c := Chinese{}//创建一个美国人:a := American{}//美国人打招呼:greet(a)//中国人打招呼:greet(c)
}

2、接口

  • 接口中不能包含任何变量
  • 接口中定义一组方法,但不需要实现
  • Go中没有implements关键字,实现接口要实现所有的方法才是实现,即Go的实现是基于方法的

3、接口的注意点

1)接口本身不能创建实例,但是可以指向一个实现了该接口的自定义类型的变量

//直接用接口创建实例并调用方法,编译报错
//var s SayHello
//s.sayHello()
c := Chinese{}
var s SayHello = c
s.sayHello()

2)只要是自定义数据类型,就可以实现接口,不仅仅是结构体类型

在这里插入图片描述
3)一个自定义类型可以实现多个接口

package main
import "fmt"type AInterface interface{a()
}type BInterface interface{b()
}type Stu struct{
}//实现接口A(的方法)
func (s Stu) a(){fmt.Println("aaaa")
}
//实现接口B(的方法)
func (s Stu) b(){fmt.Println("bbbb")
}func main(){var s Stuvar a AInterface = s		//注意这里的赋值var b BInterface = s		//注意这里的赋值a.a()b.b()
}

4)一个接口(比如A接口)可以继承多个别的接口(比如B,C接口),这时如果要实现A接口,也必须将B,C接口的方法也全部实现

package main
import "fmt"
//C接口
type CInterface interface{c()
}//B接口
type BInterface interface{b()
}//A接口继承了B、C接口,且有自己的方法a()
type AInterface interface{BInterfaceCInterfacea()
}//Stu结构体实现A接口,也要去实现B、C接口的方法
type Stu struct{
}func (s Stu) a(){fmt.Println("a")
}
func (s Stu) b(){fmt.Println("b")
}
func (s Stu) c(){fmt.Println("c")
}
func main(){var s Stuvar a AInterface = sa.a()a.b()a.c()
}

5)interface类型默认是一个指针(引用类型),如果没有对interface初始化就使用,那么会输出nil

6)空接口没有任何方法,所以可以理解为所有类型都实现了空接口,也可以理解为我们可以把任何一个变量赋给空接口

在这里插入图片描述

注意上面两种空接口类型的写法,一种是自己定义一个:

type E interface{
}Var e E = s

也可:

var e interface{} = s

4、多态

面向对象的最后一个特征:多态,即多种形态,编译时、运行时两种状态。Go中的多态特征是通过接口实现的,可以按照统一的接口来调用不同的实现。如上面Part1中的SayHello,形参就是一个父类接口:

在这里插入图片描述

再比如定义SayHello数组,存放中国人结构体、美国人结构体

在这里插入图片描述

5、断言

直接判断是否是该类型的变量,Java的instanceOf

value, ok := element.(T)

即,element是否为T类型,是转为T,值为value,且ok为true

package main
import "fmt"
//接口的定义:定义规则、定义规范,定义某种能力:
type SayHello interface{//声明没有实现的方法:sayHello()
}
//接口的实现:定义一个结构体:
//中国人:
type Chinese struct{name string
}
//实现接口的方法---》具体的实现:
func (person Chinese) sayHello(){fmt.Println("你好")
}
//中国人特有的方法
func (person Chinese) niuYangGe(){fmt.Println("东北文化-扭秧歌")
}
//接口的实现:定义一个结构体:
//美国人:
type American struct{name string
}
//实现接口的方法---》具体的实现:
func (person American) sayHello(){fmt.Println("hi")
}
//定义一个函数:专门用来各国人打招呼的函数,接收具备SayHello接口的能力的变量:
func greet(s SayHello){s.sayHello()//断言:ch,flag := s.(Chinese)//看s是否能转成Chinese类型并且赋给ch变量,flag是判断是否转成功if flag == true{ch.niuYangGe()}else{fmt.Println("美国人不会扭秧歌")}fmt.Println("打招呼。。。")
}
func main(){//创建一个中国人://c := Chinese{}//创建一个美国人:a := American{}//美国人打招呼:greet(a)//中国人打招呼://greet(c)
}

关键点:

在这里插入图片描述

6、Type Switch

一种特殊的switch语句,用type关键字。用法:

//定义一个函数:专门用来各国人打招呼的函数,接收具备SayHello接口的能力的变量:
func greet(s SayHello){s.sayHello()switch s.(type){//type属于go中的一个关键字,固定写法case Chinese:ch := s.(Chinese)ch.niuYangGe()case American:am := s.(American)am.disco()}fmt.Println("打招呼。。。")
}

完整示例:

package main
import "fmt"
//接口的定义:定义规则、定义规范,定义某种能力:
type SayHello interface{//声明没有实现的方法:sayHello()
}
//接口的实现:定义一个结构体:
//中国人:
type Chinese struct{name string
}
//实现接口的方法---》具体的实现:
func (person Chinese) sayHello(){fmt.Println("你好")
}
//中国人特有的方法
func (person Chinese) niuYangGe(){fmt.Println("东北文化-扭秧歌")
}
//接口的实现:定义一个结构体:
//美国人:
type American struct{name string
}
//实现接口的方法---》具体的实现:
func (person American) sayHello(){fmt.Println("hi")
}
func (person American) disco(){fmt.Println("野狼disco")
}
//定义一个函数:专门用来各国人打招呼的函数,接收具备SayHello接口的能力的变量:
func greet(s SayHello){s.sayHello()switch s.(type){//type属于go中的一个关键字,固定写法case Chinese:ch := s.(Chinese)ch.niuYangGe()case American:am := s.(American)am.disco()}fmt.Println("打招呼。。。")
}
func main(){//创建一个中国人:c := Chinese{}//创建一个美国人://a := American{}//美国人打招呼://greet(a)//中国人打招呼:greet(c)
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/585693.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Ubuntu】用 VMware 安装 macOS

本教程使用 Ubuntu 20.04.6 LTS,VMware Workstation Pro 17.5.1,macOS Sonoma 14.4。文中所有需要的下载链接均以 Markdown 的形式体现在文字上。 下载 VMware Workstation Pro,目前最新版本是 17.5.1。 使用密钥,进行破解。 VM…

4.1作业

对菱形继承给出的代码中每一个类,写一个有参构造函数写出下列类的,构造函数(有参、无参),析构函数,拷贝构造函数和拷贝赋值函数 class Father { int *p; const string name; } class Son:public Father { int *age; 3整理思维导图…

51单片机学习笔记12 SPI接口 使用1302时钟

51单片机学习笔记12 SPI接口 使用1302时钟 一、DS1302简介1. 功能特性2. 涓流充电3. 接口介绍时钟数据和控制线:电源线:备用电池连接: 二、寄存器介绍1. 控制寄存器2. 时间寄存器3. 日历/时钟寄存器 三、BCD码介绍四、DS1302时序1. 读时序2. …

linux时间同步工具chrony的配置和时间设置的相关说明

目录 目录 介绍 1.搭建ntp服务器 2.配置ntp客户端 3.其他设置 4.客户端无法进行时间同步 介绍 目前比较流行的时间同步工具有ntpd和chrony,ntpd采用123/UDP端口通信,chrony采用323/UDP端口通信。Centos7以上版本默认安装chrony服务来同步时间&#x…

《系统架构设计师教程(第2版)》第8章-系统质量属性与架构评估-02-系统架构评估

文章目录 1. 一些重要概念1.1 敏感点 (Sensitivity Point)1.2 权衡点 (Tradeoff Point)1.3 风险承担者 (Stakeholders)1.3.1 系统生产者1.3.2 系统消费者1.3.3 系统服务人员1.3.4 其它人员 1.4 场景 (scenarios) 2. 系统架构评估方法2.1 基于场景的架构分析方法(SAA…

【漏洞复现】Wordpress saveconfiguration接口处存在任意文件上传漏洞

免责声明:文章来源互联网收集整理,请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文章作者无关。该…

怎么在UE游戏中加入原生振动效果

我是做振动触感的。人类的五感“视听嗅味触”,其中的“触”就是触觉,是指皮肤、毛发与物体接触时的感觉。触感可以带来更加逼真的沉浸式体验。但也许过于司空见惯,也是习以为常,很多人漠视了触感的价值。大家对触感的认知还远远不…

计算机的组成

🐇明明跟你说过:个人主页 🏅个人专栏:《Kubernetes航线图:从船长到K8s掌舵者》 🏅 🔖行路有良友,便是天堂🔖 目录 一、电脑硬件的五大单元 二、CPU的架构 1、指令…

蓝桥杯刷题第六天(昨天忘记发了)

今天想从不一样的角度来解题:从时间紧张暴力求解到思路阔达直接通过所有案例 暴力方法: 思路第一眼看到这个问题我就想到了第一个思路就是先用两个数组一个存石子数一个存颜色状态,每次遍历一遍看看有没有相邻石子颜色一样且为和最小的。 im…

int的最大值加1会变成int的最小值

一、概要 int是4个字节,总共是32个bit位,所以总共能表示2^32个数 int的最大值是2^31-1,也就是2147483647,大约21亿多 减的那个1表示自然数0的位置 int的最小值是-2^31,也就是-2147483648,大约负的21亿多…

【Cadence Allegro】如何差分对走线

一、创建espice模型 shift+F2或者“Analyze-Model Assigment”创建espice模型,这个操作是为了让差分线路里的串接电阻(或电感电容)变为xnet类型方便准确等长走线。 Cadence Allegro Xnet的创建详细教程 - 知乎Cadence Allegro Xnet的创建详细教程Xnet是指在无源器件的两端,…

瑞_23种设计模式_迭代器模式

文章目录 1 迭代器模式(Iterator Pattern)★★★1.1 介绍1.2 概述1.3 迭代器模式的结构1.4 中介者模式的优缺点1.5 中介者模式的使用场景 2 案例一2.1 需求2.2 代码实现 3 案例二3.1 需求3.2 代码实现 4 JDK源码解析 🙊 前言:本文…