当前位置: 首页 > news >正文

12 Go的接口

概述

        在上一节的内容中,我们介绍了Go的作用域,包括:局部作用域、全局作用域、命名空间作用域等。在本节中,我们将介绍Go的接口。Go语言中的接口是一种类型,它定义了一组函数的集合。接口是一种抽象的描述,它定义了一个对象的行为,而不关心对象的具体类型。通过接口,可以实现多态性,即一个对象可以实现多个接口,从而实现不同接口的行为。

        在Go语言中,接口是一种定义了一组函数签名的抽象类型。这些函数签名包括:函数的名称、参数列表和返回类型。一个类型如果满足某个接口的所有函数,则称该类型实现了该接口。

定义接口

        可以通过type关键字和大括号{}来定义接口,其定义格式如下:

type 接口名称 interface {函数1(参数列表) 返回值列表函数2(参数列表) 返回值列表// 更多函数
}

        在下面的示例代码中,我们定义了一个名为Shape的接口,其中包含Area()和Perimeter()两个函数。

type Shape interface {Area() float64Perimeter() float64
}

实现接口

        要实现一个接口,需要在类型中实现接口中定义的所有函数。另外,函数的签名必须与接口中定义的函数一致。Go语言中的接口是隐式实现的,也就是说,如果一个类型实现了一个接口定义的所有函数,那么它就自动地实现了该接口。

        在下面的示例代码中,Rectangle类型实现了Shape接口的所有函数。这样,Rectangle对象就可以赋值给Shape类型的变量,并且可以通过Shape类型的变量调用这些函数。

type Rectangle struct {width float64height float64
}func (r Rectangle) Area() float64 {return r.width * r.height
}func (r Rectangle) Perimeter() float64 {return 2 * (r.width + r.height)
}

使用接口

        使用接口时,可以将实现了接口的类型赋值给接口类型的变量。比如:可以将一个Rectangle类型的结构体赋值给Shape接口类型的变量s,赋值后,变量s引用了Rectangle类型,并且可以使用Shape接口中定义的函数。

        在下面的示例代码中,我们首先定义了一个Shape接口,它包含了两个函数:Area()和Perimeter()。然后,我们分别定义了Rectangle和Circle两个结构体,并为它们实现了Area()和Perimeter()函数。这两个结构体分别实现了Shape接口的函数,因此它们可以被赋值给Shape类型的变量。在main()函数中,我们分别创建了一个矩形和一个圆形对象,并将它们赋值给了Shape接口变量s。最后,我们通过调用s.Area()和s.Perimeter()函数来计算它们的面积和周长,并打印结果。

package mainimport "fmt"// 定义一个形状的接口
type Shape interface {Area() float64Perimeter() float64
}// 定义一个矩形结构体,并实现Shape接口的函数
type Rectangle struct {width float64height float64
}func (r Rectangle) Area() float64 {return r.width * r.height
}func (r Rectangle) Perimeter() float64 {return 2 * (r.width + r.height)
}// 定义一个圆形结构体,并实现Shape接口的函数
type Circle struct {radius float64
}func (c Circle) Area() float64 {return 3.14 * c.radius * c.radius
}func (c Circle) Perimeter() float64 {return 2 * 3.14 * c.radius
}func main() {rectangle := Rectangle{width: 66, height: 10}// /将Rectangle对象赋值给Shape接口类型的变量var shape Shape = rectangle// 调用Shape接口的函数fmt.Println("Area:", shape.Area())fmt.Println("Perimeter:", shape.Perimeter())circle := Circle{radius: 10}// /将Circle对象赋值给Shape接口类型的变量shape = circle// 调用Shape接口的函数fmt.Println("Area:", shape.Area())fmt.Println("Perimeter:", shape.Perimeter())
}

        在Go语言中,接口提供了一种抽象的描述,可以用来定义对象的行为,任何实现了接口中定义的所有函数的类型都被认为是实现了该接口。通过使用接口,我们可以实现多态性、组合和依赖注入等功能,使代码更加灵活、可复用和易于维护。

空接口

        在Go语言中,空接口是一种特殊的接口类型,它没有任何函数定义。空接口可以表示任何类型的值,因为它没有任何限制。空接口的定义使用一对空的大括号来表示,如下:

          var emptyInterface interface{}

        通过将一个值赋给空接口变量,可以将其转换为任意类型。其他任何类型的值都可以赋值给空接口变量,因为空接口可以适应任何类型。

        在下面的示例代码中,我们声明了一个空接口变量emptyVar,然后分别将其赋值为整数、字符串和自定义结构体类型。由于空接口可以适应任何类型,这些赋值都是有效的。

package mainimport "fmt"func main() {var emptyVar interface{}emptyVar = 66// 输出: 66fmt.Println(emptyVar)emptyVar = "Hello, CSDN"// 输出: Hello, CSDNfmt.Println(emptyVar)type Person struct {name stringage  int}emptyVar = Person{name: "Mike", age: 32}// 输出: {Mike 32}fmt.Println(emptyVar)
}

        使用空接口可以在程序中实现更灵活和可扩展的逻辑,但需要注意的是:使用空接口时需要小心类型转换的安全性,因为空接口变量中存储的值可能与你预期的类型不同。建议在使用空接口时,进行类型断言以确保类型的安全性。

相关文章:

12 Go的接口

概述 在上一节的内容中,我们介绍了Go的作用域,包括:局部作用域、全局作用域、命名空间作用域等。在本节中,我们将介绍Go的接口。Go语言中的接口是一种类型,它定义了一组函数的集合。接口是一种抽象的描述,它…...

Python编程-----并行处理应用程序

目录 一.进程 二.线程 三.Python标准库中并行处理的相关模块 Threading模块 (1)使用Thread对象创建线程 (2)自定义派生于Thread的对象 (3)线程加入join() (4)用户线程和daemon线程 (5)Timer线程 线…...

kubernetes集群编排——istio

官网:https://istio.io/latest/zh/about/service-mesh/ 部署 [rootk8s2 ~]# tar zxf istio-1.19.3-linux-amd64.tar.gz [rootk8s2 ~]# cd istio-1.19.3/[rootk8s2 istio-1.19.3]# export PATH$PWD/bin:$PATH demo专为测试准备的功能集合 [rootk8s2 istio-1.19.3]# i…...

mfc140u.dll丢失的解决方法,以及mfc140u.dll解决方法的优缺点

在使用电脑过程中,有时会遇到一些与动态链接库文件(DLL)相关的错误。其中,mfc140u.dll丢失的错误是较为常见的一种。当这个关键的mfc140u.dll文件丢失或损坏时,可能会导致某些应用程序无法正常运行。在本文中&#xff…...

2源码安装网络协议

2.2源码安装/网络协议 一、源码包应用场景 有时我们所用的内核版本太旧,系统自带的库(如libstdc.so.6)版本低或者依赖的其他软件版 本较低,导致无法安装目标软件。 软件/库其实是对机器汇编指令集的封装,在X86体系下…...

未来服务器操作系统的趋势与展望

摘要: 随着云计算、大数据和人工智能不断的发展,服务器操作系统也需要随之进行新一轮的升级。本文通过分析当前服务器操作系统的现状,探讨了未来服务器操作系统的趋势和展望,并针对一些关键问题提出了解决方案。 一、引言 服务器…...

VB.net WebBrowser网页元素抓取分析方法

在用WebBrowser编程实现网页操作自动化时,常要分析网页Html,例如网页在加载数据时,常会显示“系统处理中,请稍候..”,我们需要在数据加载完成后才能继续下一步操作,如何抓取这个信息的网页html元素变化&…...

自建ES6.2.4切阿里云商业版ES(7.10)整体方案

一、切换目的&阿里云商业版ES版本选择 1.1 升级切换阿里云商业版7.10目的 自建的Elasticsearch服务运维难度高,操作复杂,需要手动调整资源,遇到性能瓶颈时优化难度相对云上Elasticsearch较大。使用阿里云提供的ES服务,提高系统稳定性使用云服务es,易于备份,数据恢复…...

Vue实现封装自定义指令

目录 一、什么是自定义指令? 二、自定义指令的使用 Vue中的自定义指令使用Vue.directive函数进行定义。该函数接受两个参数,第一个是指令名称,第二个是指令选项对象。 上述代码中,我们定义了一个名为my-directive的自定义指令…...

<MySQL> 查询数据进阶操作 -- 聚合查询

目录 一、聚合查询概述 二、聚合函数查询 2.1 常用函数 2.2 使用函数演示 2.3 聚合函数参数为*或列名的查询区别 2.4 字符串不能参与数学运算 2.5 具有误导性的结果集 三、分组查询 group by 四、分组后条件表达式查询 五、MySQL 中各个关键字的执行顺序 一、聚合查询…...

arm开发板

一个简单的hello world程序 minicom用来和开发板之间交互并且可以向开发板传输文件。打印hello world字符串。在linux虚拟机上编译我的代码,使用的交叉编译工具是arm-linux-gnueabihf-gcc (hard float) 可以使用 readelf -h libc.so.6 查看开发板是不是&#xff08…...

nodejs+vue教室管理系统的设计与实现-微信小程序-安卓-python-PHP-计算机毕业设计

用户 用户管理:查看,修改自己的个人信息 教室预约:可以预约今天明天的教室,按着时间段预约(可多选),如果当前时间超过预约时间段不能预约该时间段的教室 预约教室的时候要有个预约用途&#xff…...

rabbitMQ的Topic模式的生产者与消费者使用案例

topic模式 RoutingKey 按照英文单词点号多拼接规则填充。其中消费者匹配规则时候 * 代表一个单词,#表示多个单词 消费者C1的RoutingKey 规则按照*.orange.* 匹配 绑定队列Q1 package com.esint.rabbitmq.work05;import com.esint.rabbitmq.RabbitMQUtils; import …...

【软考篇】中级软件设计师 第五部分

中级软件设计师 第五部分 三十六. 下午题变动题型参考答案例题一 如何保持数据流图平衡例题二 结构化语言例题三 关系模式例题四 用例关系内涵例题五 观察者模式 三十七:下午题第四题往年算法部分参考答案 读前须知: 【软考篇】中级软件设计师 学前须知 …...

论文阅读——RetNet

transformer的问题:计算量大,占用内存大,不好部署。 所以大家在找能解决办法,既能和transformer表现一样好,又能在推理阶段计算复杂度很低。 这些方法大概分类三类:一是代替transformer非线性注意力机制的…...

【Proteus仿真】【51单片机】锂电池管理系统

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真51单片机控制器,使用LCD1602显示模块、DS18B20温度传感器、PCF8691 ADC模块、按键、LED蜂鸣器模块等。 主要功能: 系统运行后,LCD1602显示温度…...

【工具使用-VScode】设置 VSCode 的自动保存功能

要设置 VSCode 的自动保存功能,请按照以下步骤进行操作: 打开 VSCode 编辑器。在顶部菜单中选择 “文件(File)”。选择 “首选项(Preferences)”。在下拉菜单中选择 “设置(Settings&#xff0…...

常用Git命令记录

持续补充… git add&#xff1a;提交到暂存区git remote add <remote_name> <remote_url> : 添加一个新的远程仓库。指定一个远程仓库的名称和 URL&#xff0c;将其添加到当前仓库中。git commit&#xff1a;暂存区提交到本地仓库&#xff1b;-m&#xff1a;添加日…...

Go语言常用库

Go语言常用库 文本主要介绍Go常用的一些系统库&#xff1a; sort、math、copy、strconv、crypto 1、sort package mainimport ("fmt""sort" )// sort // int排序 // sort.Ints([]int{}) // 字符串排序 // sort.Strings([]string{}) // 自定义排序 // s…...

二叉树(进阶)

文章目录 1.内容安排说明2. 二叉搜索树2.1二叉搜索树的概念2.2二叉搜索树的实现2.3二叉树的性能&#xff1a; 搜索二叉树的应用k 模型kv模型 1.内容安排说明 二叉树在前面c数据结构阶段&#xff1b;已经讲过了&#xff1b;本节取名二叉树进阶的原因是&#xff1a; 1.map和set特…...

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API&#xff0c;用于在函数组件中使用 state 和其他 React 特性&#xff08;例如生命周期方法、context 等&#xff09;。Hooks 通过简洁的函数接口&#xff0c;解决了状态与 UI 的高度解耦&#xff0c;通过函数式编程范式实现更灵活 Rea…...

React hook之useRef

React useRef 详解 useRef 是 React 提供的一个 Hook&#xff0c;用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途&#xff0c;下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统

医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上&#xff0c;开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识&#xff0c;在 vs 2017 平台上&#xff0c;进行 ASP.NET 应用程序和简易网站的开发&#xff1b;初步熟悉开发一…...

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用

1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

用docker来安装部署freeswitch记录

今天刚才测试一个callcenter的项目&#xff0c;所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...

2023赣州旅游投资集团

单选题 1.“不登高山&#xff0c;不知天之高也&#xff1b;不临深溪&#xff0c;不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...

MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用

文章目录 一、背景知识&#xff1a;什么是 B-Tree 和 BTree&#xff1f; B-Tree&#xff08;平衡多路查找树&#xff09; BTree&#xff08;B-Tree 的变种&#xff09; 二、结构对比&#xff1a;一张图看懂 三、为什么 MySQL InnoDB 选择 BTree&#xff1f; 1. 范围查询更快 2…...

Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案

在大数据时代&#xff0c;海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构&#xff0c;在处理大规模数据抓取任务时展现出强大的能力。然而&#xff0c;随着业务规模的不断扩大和数据抓取需求的日益复杂&#xff0c;传统…...

云原生周刊:k0s 成为 CNCF 沙箱项目

开源项目推荐 HAMi HAMi&#xff08;原名 k8s‑vGPU‑scheduler&#xff09;是一款 CNCF Sandbox 级别的开源 K8s 中间件&#xff0c;通过虚拟化 GPU/NPU 等异构设备并支持内存、计算核心时间片隔离及共享调度&#xff0c;为容器提供统一接口&#xff0c;实现细粒度资源配额…...