Go语言程序设计(十五)接口

news2024/9/21 2:50:13

一、接口的概念

        简单地说,Interface是一组Method的组合,可以通过Interface来定义对象的一组行为。如果某个对象实现了某个接口的所有方法,就表示它实现了该“接口”,无须显式地在该类型上添加接口说明。
        假设定义了两个对象Teacher和Student, Teacher实现了方法Reading、Writing和Teaching , Student实现了方法Reading、Writing和Studying。被对象Teacher和Student实现的方法组合就称为Interface。
        例如,Teacher和Student都实现了Interface: Reading 和Writing,也就是说这两个对象是该Interface类型。而对象Student没有实现Interface: Reading、Writing和Teaching,因为它没实现Teaching这个方法。

二、接口的定义

        Interface的定义形式看上去和Struct类似,但是Interface是一个方法的集合,它里面没有其他类型变量,而且Method只用定义原型不用实现。
        Interface要使用关键字“type"和“interface"定义,基本格式如下:

type interfaceName interface{
    methodName(参数列表)(返回值)
    methodName(参数列表)(返回值)
    methodName(参数列表)(返回值)
        .
        .
        .
}

注意事项:

  • (1)在Go语言中,Interface命名时习惯性以“er”结尾,比如: Printer、Reader、Writer等,即通常以动名词来命名。其他面向对象语言Interface 命名时通常以大写字母“I”开头,比如. NET.Java等。
  • (2)在Go语言中,一个Interface中包含的Method不宜过多,一般0~3个即可。
  • (3)一个Interface可以被任意的对象实现;相同地,一个对象也可以实现多个Interface。

例如:

 三、接口组合

        在Go语言中,除了类型可以匿名组合,接口也可以组合在一起。将一个接口匿名嵌入到另外一个接口中,就是接口组合( Interface combination),这种组合类似于接口的继承( Interface inheritance)。

type SpeakLearner interface{
    Speaker
    Learner
}

        该例中接口SpeakLearner组合了Speaker和Learner两个接口,它既能做Speaker接口的所有事情,又能做Learner接口的所有事情。
        可以认为接口组合是类型匿名组合的一个特殊事例,只不过接口只包含方法,而不包含任何成员变量。

四、空接口

在Go语言中,任何数据类型都默认实现了空Interface,空接口可以这样定义:

interface{}

        空接口也就是包含0个Method的Interface,所以可以使用空接口interface{}定义任意类型变参函数。一个函数把interface{}作为参数,那么它可以接受任意类型的值作为参数,如果一个函数返interface{},就可以返回任意类型的值。
例如:

//函数test1返回1个interface{ }
func test1(a interface{}) {}
//函数test2可返回多个interface{}
func test2(a ... interface{}) {}

        Go语言中的空接口的作用类似于C语言中的void* ,或者Java /C #中的System.Object。

五、接口执行机制

        在Go语言中,接口作为一种引用数据类型,是可被实例化的类型,当定义了一个接口类型变量时,系统将会为其分配内存,并将赋值给它的对象复制存储到该内存区。

接口对象内部由两部分组成:Itab指针和data指针。

struct Iface
{
    Itab * tab;
    void * data;
};

        Itab依据data类型创建,存储了接口动态调用的元数据信息,其中包括data类型所有符合接口签名的方法地址列表。使用接口对象调用方法时,就从Itab中查找所对应的方法,并将*data(指针)作为Receiver参数传递给该方法,从而完成实际目标方法调用。
        而编译器在构建Itab时,会区分T和* T方法集(Method sets) ,并从中获取接口实现方法的地址指针。接口调用不会做Receiver自动转换,目标方法必须在接口实现的方法集中。

接口方法集规则如下:
(1) T仅拥有属于T类型的方法集,而*T则同时拥有(T+ * T)方法集。
(2)基于T实现方法,表示同时实现了interface( T)和interface(* T)接口。
(3)基于*T实现方法,那就只能是对interface(*T)实现接口。

六、接口的赋值

        与其他面向对象语言不同,Go语言中的接口还可以赋值,如果定义了一个Interface的变量,那么这个变量里面可以存储实现这个Interface的任意类型的对象。
        例如上面例子中,如果定义了一个Speaker接口类型的变量is,那么is里面就可以存储对象People、Teacher或者Student的值。
        因为接口类型is 能够同时持有这三种类型的对象,所以可以定义一个包含Speaker接口类型元素的Slice,这个Slice可以被赋予实现了Speaker接口的任意结构的对象,这个和传统意义上面的Slice有所不同。

 编译并运行该程序,输出结果为:

Hi,I'm张三,Nice to meet you!
Hi,my name is郑智,I'm work ing in Computer Science.
Hi,my name is李明,I'm studing in Yale University.
I'm learning Golang in Yale University.

七、接口类型推断

        通过接口的赋值可知,接口类型变量里面可以存储任意类型的数值(该类型实现了Interface)。那么如何反向知道接口类型变量里面实际保存的是哪一种类型的对象呢?这就是接口类型推断。
        利用接口类型推断,可以判断接口对象是否是某个具体的接口或者类型。在Go语言中,目前有两种常用的方法可以进行接口类型推断:Comma-ok断言和Switch测试。

1、Comma-ok断言

使用Comma-ok断言可以进行接口类型查询,格式如下:

value, ok= element.(T)

        上式中value是变量的值,ok是bool类型,element是接口类型变量,T是断言的类型。如果element里面确实存储了T类型的数值,那么ok返回true,否则返回false。

2、Switch测试

        除了使用Commaok断言,还可以使用Switch测试推断接口类型,而且程序结构更简洁,格式如下:

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

        需要强调的是:element.(type)语法不能在Switch语句外的任何逻辑语句里面使用,如果要在Switch外面判断一个类型就要使用Comma-ok断言。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SQL-每日一题【550.游戏玩法分析Ⅳ】

题目 Table: Activity 编写一个 SQL 查询,报告在首次登录的第二天再次登录的玩家的比率,四舍五入到小数点后两位。换句话说,您需要计算从首次登录日期开始至少连续两天登录的玩家的数量,然后除以玩家总数。 查询结果格式如下所示…

MYSQL的基本数据类型和建库

1.创建数据库,删除数据库,查询创建数据的语句,使用数据库,查询当前默认的数据库以及使用的编码方式校验规则 2.数字,文本,日期 在一章表中定义多个字段,要使用今天提到的所有的数据类型 1创建数…

10款设计师常用的APP页面设计软件

APP页面设计是APP实施过程中的关键步骤,APP页面设计是不是别具一格,取决于消费者对APP最直观的视觉效果分辨。 要创建一个令人惊讶的APP页面设计,一个高效率的APP界面设计软件是不可缺少的。 本文列出10款最流行的APP界面设计软件&#xff…

VScode搭建C/C++开发环境

目录 1.VScode是什么? 2.VScode的下载和安装 2.1下载和安装 下载: 安装: 2.2环境的介绍 环境介绍: 安装中文版插件 : 3.VScode配置C/C开发环境 3.1下载和配置MinGW-w64 编译器套件 下载: 配置M…

每日浅读SLAM论文——简析LIO-SAM

文章目录 Overview雷达里程计IMU预积分GPS回环代码结构解析 今天讲一篇经典的LIO(LiDAR-Inertial Odometry)SLAM论文——LIO-SAM。 雷达里程计由于其高鲁棒性、较低成本(二维雷达不贵、三维雷达价格也在降、IMU不太贵)&#xff0c…

【解决】uniapp的全局公共组件(不用在每个页面引入组件标签),各平台均可使用!!!!

感谢滚动君大佬提供的思路,但是此方法只适用于微信小程序 app端之所以不能用的关键原因在于不能找到resourcePath原始路径,不像小程序会提供一个路径区分哪些文件来自组件哪些文件来自页面,如果不做区分,那么页面栈就会超载&…

EasyCVR视频融合平台国标级联后推送不了通道是什么原因?

EasyCVR视频融合平台基于云边端一体化架构,具有强大的数据接入、处理及分发能力,平台支持海量视频汇聚管理,可支持多协议、多类型的设备接入,并能对设备进行分级、分组管理,并支持权限、角色分配,属于功能全…

电子时钟制作(瑞萨RA)(9)----读取DHT11温湿度数据

概述 本篇介绍如何驱动DH11湿度传感器同时实现当前串口数据打印。 DHT11 数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。 硬件准备 首先需要准备一个开发板,这里我准备的是芯片型号R7FA2E1A72DFL的开发板: 视频教程 https://www…

从零实现深度学习框架——注意力机制

引言 本着“凡我不能创造的,我就不能理解”的思想,本系列文章会基于纯Python以及NumPy从零创建自己的深度学习框架,该框架类似PyTorch能实现自动求导。 💡系列文章完整目录: 👉点此👈 要深入理解…

网络数据包的监听与分析——IP数据报文分析

1. 抓包工具下载 x下面是一个IP数据报的抓包软件——IPtool的蓝奏云下载链接 https://wwix.lanzoue.com/iaGpy11klpnc 2. iptool使用 下载解压之后,右击以管理员身份运行,打开该exe文件即可 然后点击绿色运行就开始捕包了 随便点一个包进去进行分析就可…

Java文档

API(Application Programming Interface,应用程序编程接口)是Java提供的基本编程接口(java提供的类还有相关方法)。中文在线文档:Java 8 中文版 - 在线API手册 - 码工具 (matools.com) Java语言提供了大量…

Java项目 仿天猫商城系统(springboot+mybatis+mysql+maven+jsp)

基于springbootmybatismysqlmavenjsp仿天猫商城系统 一、系统介绍1、系统主要功能:2.涉及技术框架: 二、功能展示三、其它系统四、获取源码 一、系统介绍 1、系统主要功能: 项目主要参考天猫商城的购物流程:用户从注册开始&…

浅谈线段树

1.前言 Oi-Wiki上的线段树 同步于 c n b l o g s cnblogs cnblogs发布。 如有错误,欢迎各位 dalao 们指出。 注:本篇文章个人见解较多,如有不适,请谅解。 前置芝士 1.二叉树的顺序储存 2.线段树是什么? 线段树…

“量贩零食”热潮袭来:真风口还是假繁荣?

以前只听过量贩式KTV,现在“量贩零食店”也出现在了大街小巷。 高考结束后,家住武汉的花花频繁逛起了量贩零食店。这类店把各种零食集合在一起销售,用低价来换取高销量,主打一个性价比。店里的散装零食即便按斤售卖,也…

蛋白组学 差异蛋白分析 富集分析 go kegg

生信学习day1-蛋白组分析 蛋白质组差异分析的三个R包 - 知乎 (zhihu.com)https://zhuanlan.zhihu.com/p/448479536Introduction to DEP (bioconductor.org)http://www.bioconductor.org/packages/release/bioc/vignettes/DEP/inst/doc/DEP.html#lfq-based-dep-analysis浅谈蛋白…

阿里云coluder认证训练营开班!

在这个充满机遇和挑战的时代里,云计算已经成为推动企业创新和发展的关键技术。而作为云计算人才培训领域的领军企业,摩尔狮致力于培养更多优秀的云技术人才, 所以摩尔狮联合阿里云为大家打造了免费的云计算入门课程——Clouder认证集训营&…

全方位了解VR全景展示与制作

引言: 虚拟现实(VR)技术正在以惊人的速度改变我们的生活方式和体验方式。其中,VR全景展示与制作作为虚拟现实的重要应用之一,为用户提供了身临其境的视听体验。 一、了解VR全景展示与制作 1.VR全景展示 VR全景展示是…

JDK,JRE,JVM的区别

1.JVM JVM,也叫java虚拟机,用来运行字节码文件,可将字节码翻译为机器码,JVM是实现java跨平台的关键,可以让相同的java代码在不同的操作系统上运行出相同的结果。 2.JRE JRE,也叫java运行时环境&#xff…

【JS】javascript学习笔记

step by step. 目录 严格区分大小写 点击事件: JavaScript关键字/语句标识符 数据类型 对象Object 创建对象方法 事件 循环 标签 正则表达式 异常 未定义adddlert-> throw—— 调试工具debugger ​编辑 JS严格模式 表单 严格区分大小写 点击事件&am…

python3 学习笔记

一、注释 1.单行注释:# 开头 2.多行注释: 和 """ 二、缩进 python是使用缩进来表示代码块,不需要使用大括号{} python具有严格的缩进原则,每个缩进一般可以有两个或四个空格组成,也可以是任意数量的…