Go语言---接口interface、接口转换、继承、类型查询

接口(interface)概念

在 Go 语言中,接口(interface)是一个自定义类型,接口类型具体描述了一系列方法的集合。
接口又称为动态数据类型,在进行接口使用的的时候,会将接口对位置的动态类型改为所指向的类型,会将动态值改成所指向类型的结构体。

接口可以让我们将不同的类型绑定到一组公共的方法上,从而实现多态和灵活的设计。

接口类型是一种抽象的类型,它不会暴露出它所代表的对象的内部值的结构和这个对象支持的基础操作的集合,它们只会展示出它们自己的方法。因此接口类型不能将其实例化。
Go通过接口实现了鸭子类型(duck-typing):“当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子”。我们并不关心对象是什么类型,到底是不是鸭子,只关心行为。

接口的定义

type Humaner interface{
	SayHi()
}
  • 接口命名习惯以 er 结尾
  • 接口只有方法声明,没有实现,没有数据字段
  • 接口可以匿名嵌入共它接口,或嵌入到结构中

接口的实现

  • 接口是用来定义行为的类型。这些被定义的行为不由接口直接实现,而是由用户定义的类型实现,一个实现了这些方法的具体类型是这个接口类型的实例。
  • 如果用户定义的类型实现了某个接口类型声明的一组方法,那么这个用户定义的类型的值就可以赋给这个接口类型的值。这个赋值会把用户定义的类型的值存入接口类型的值。
    在这里插入图片描述
  • 在定义接口类型的变量以后,只要是实现了此接口方法的类型,就可以赋值给这个接口类型的变量。
  • 赋给它什么类型就调用此类型实现的接口方法。

更为常用的方法是定义一个普通函数,函数的参数为接口类型,然后通过调用这个函数,实现不同的方法—相当于多态

在这里插入图片描述

  • 也可以通过切片的方法实现
    在这里插入图片描述

接口的继承

超集

如果一个集合S2中的每一个元素都在集合S1中,且集合S1中可能包含S2中没有的元素,则集合S1就是S2的一个超集。

子集

对于两个集合A与B,如果集合A的任何一个元素都是集合B的元素,我们就说集合A包含于集合B,或集合B包含集合A,也说集合A是集合B的子集。如果集合A的任何一个元素都是集合B的元素,而集合B中至少有一个元素不属于集合A,则称集合A是集合B的真子集。空集是任何集合的子集。

任何一个集合是它本身的子集.空集是任何非空集合的真子集。

接口之间也是可以继承的

在这里插入图片描述

接口之间的转换—变量转换

超集可以转换为子集,反过来不可以
在这里插入图片描述

  • 转换以后只能调用子集有的方法了
    在这里插入图片描述
    在这里插入图片描述

空接口

空接口(interface{})不包含任何的方法,正因为如此,所有的类型都实现了空接口,因此空接口可以存储任意类型的数值。它有点类似于语言的void*类型。
在这里插入图片描述
当函数可以接受任意的对象实例时,我们会将其声明为interface{},最典型的例子是标准库fmt中 Printxxx系列的所数,例如:
在这里插入图片描述

类型查询

我们知道 interface 的变量里面可以存储任意类型的数值(该类型实现了 interface)。那么我们怎么反向知道这个变量里面实际保存了的是哪个类型的对象呢?目前常用的有两种方法:

  • comma-ok断言
  • switch 测试

comma-ok断言

if value, ok := data.(int); ok == true{
}

在这里插入图片描述

switch测试

switch value := data.(type) {
	case int:
		.....
	case string:
		...........
	case Student:
		.........
	}

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Kafka抛弃Zookeeper后如何启动?

Kafaka如何下载 官网地址 目前Kafka最新的版本就是3.7.1 我们可以看到下面这两个版本信息?什么意思呢? Scala 2.12 - kafka_2.12-3.7.1.tgz (asc, sha512)Scala 2.13 - kafka_2.13-3.7.1.tgz (asc, sha512) 我们应该知道,一个完整的Kafka实…

塑料法兰的标准

塑料法兰的标准包括国标GB/T9112-2010、化工部标准HG5010-52~HG5028-58、机械部标准JB81-59~JB86-59、以及船用生活给排水塑料管法兰的标准CB/T 4138-2011和CB/T 4454-2017。这些标准涵盖了从国家标准到特定用途(如船用)的详细规范…

KVM把新添加的磁盘扩容到根目录

1、对新增的磁盘进行分区(注:可省略) PS:使用fdisk或gdisk(大于2T时使用)对新增磁盘进行分区。 [rootkvm-clinet ~]# fdisk/dev/sdb Welcome to fdisk (util‐linux 2.23.2).4 Changes will remain in …

Python28-8 GBM梯度提升算法

梯度提升算法(Gradient Boosting Machine,GBM)是一种集成学习方法,通过逐步构建一系列简单模型(通常是决策树),并结合这些模型来提高整体预测性能。GBM广泛用于回归和分类任务,因为它…

【计算机毕业设计】017基于微信小程序的学生公寓电费信息管理系统

🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板&#xff…

51单片机嵌入式开发:1、STC89C52环境配置到点亮LED

STC89C52环境配置到点亮LED 1 环境配置1.1 硬件环境1.2 编译环境1.3 烧录环境 2 工程配置2.1 工程框架2.2 工程创建2.3 参数配置 3 点亮一个LED3.1 原理图解读3.2 代码配置3.3 演示 4 总结 1 环境配置 1.1 硬件环境 硬件环境采用“华晴电子”的MINIEL-89C开发板,这…

在iPhone / iPad上轻松模拟GPS位置 AnyGo for Mac

在iPhone / iPad上轻松模拟GPS位置 AnyGo for Mac AnyGo for Mac是一款专为Mac电脑用户设计的虚拟定位工具。它可以模拟你的GPS位置,让你的设备显示你在任何世界上的任何地方。无论你是想在游戏中虚拟移动,还是在社交媒体上分享虚拟的旅行照片&#xff0…

基础权限存储

一丶要求 建立用户组shengcan,其id为 2000建立用户组 caiwu,其id 为2001建立用户组 jishu,其id 为 2002建立目录/sc,此目录是 shengchan 部门的存储目录,只能被 shengchan 组的成员操作4.其他用户没有任何权限建立目录/cw,此目录…

第二周:李宏毅机器学习笔记

第二周学习周报 摘要Abstract一、深度学习1.Backpropagation(反向传播)1.1 链式法则1.2 Forward pass(前向传播)1.3 Backward pass(向后传播)1.4 总结 2. Regression(神奇宝贝案例)2…

Bug记录:【com.fasterxml.jackson.databind.exc.InvalidDefinitionException】

bug记录 序列化错误 异常com.fasterxml.jackson.databind.exc.InvalidDefinitionException: 完整错误(主要是FAIL_ON_EMPTY_BEANS) 00:15:20.250 [http-nio-3000-exec-1] ERROR org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/].[dispatcherServlet] - S…

【漏洞复现】TerraMaster TOS exportUser.php 远程命令执行

免责声明: 本文内容旨在提供有关特定漏洞或安全漏洞的信息,以帮助用户更好地了解可能存在的风险。公布此类信息的目的在于促进网络安全意识和技术进步,并非出于任何恶意目的。阅读者应该明白,在利用本文提到的漏洞信息或进行相关测…

Windows编程[下]

Windows编程[下] 一、线程1. 内核对象2.多线程群聊服务器3.多线程群聊客户端4.线程同步之事件对象常用函数和参数解释 二、进程三、Qt1.第一个Qt项目2.Qt助手的使用3.QPushButton简介4.Qt对象树对象树的基本概念使用对象树模式的好处对象树的问题 5.信号与槽5.1 自定义信号和槽…

通用的职位招聘小程序ui模板

蓝色简单的校园招聘,行业招聘,职位招聘手机小程序页面模板。包含:职位列表、职位详情、基本信息填写、登录、个人主页、消息页面等功能 通用的职位招聘小程序ui模板

InvalidVersionSpecError: Invalid version spec: =2.7解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

驾校管理系统的全面革新与升级

智慧驾校系统是一款专为现代驾校量身定制的综合性管理平台,它深度融合了云计算、大数据、物联网及人工智能等前沿技术,旨在为驾校打造一个高效、智能、便捷的运营生态系统。该系统通过数字化、信息化的手段,彻底革新了传统驾校的管理模式,不仅极大地提升了驾校的运营效率,…

初识Spark

一、简介 官网:Apache Spark™ - Unified Engine for large-scale data analytics Apache的顶级项目,用于大规模数据处理的统一分析引擎。 支持语言:Java、Scala、Python和R (源码为Scala) 高级工具: 1、SparkSQL用于SQL和结构…

ARM汇编与机器码、汇编指令

文章目录 1. CISC与RISC指令集 2. ARM汇编指令 3. 汇编与机器码 4. 汇编指令格式 5. MOV指令 6. BL指令 7. B指令 8. ADD/SUB指令 9. LDR/STR指令 1. CISC与RISC指令集 根据指令的复杂度,所有CPU可以分为两类: CISC(Complex Instr…

破局 AI 2.0 时代:利用 AI 提升自我核心竞争力

文章目录 破局 AI 2.0 时代:利用 AI 提升自我核心竞争力1. AI 2.0 时代1.1 特点1.2 发展1.3 影响 2. AI 2.0 时代的机遇 & 挑战2.1 AI 对行业市场的冲击2.2 挑战变为机遇2.3 不同场景下的 AI 效能提升2.3.1 自动化办公任务2.3.2 提升学习效率2.3.3 创意生成与内…

SpringBoot彩蛋之定制启动画面

写在前面 在日常开发中,我们经常会看到各种各样的启动画面。例如以下几种 ① spring项目启动画面 ② mybatisplus启动画面 ③若依项目启动画面 还有很多各式各样好看的启动画面,那么怎么定制这些启动画面呢? 一、小试牛刀 ① 新建一个Spr…

【分布式系统三】监控平台Zabbix对接grafana(截图详细版)

目录 一.安装grafana并启动 二.浏览器访问 三.导入zabbix数据,对接grafana 四.如何导入模版 以前两篇博客为基础 【分布式系统】监控平台Zabbix介绍与部署(命令截图版)-CSDN博客 【分布式系统】监控平台Zabbix自定义模版配置-CSDN博客 …