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文件丢失或损坏时,可能会导致某些应用程序无法正常运行。在本文中ÿ…...
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 查看开发板是不是(…...
nodejs+vue教室管理系统的设计与实现-微信小程序-安卓-python-PHP-计算机毕业设计
用户 用户管理:查看,修改自己的个人信息 教室预约:可以预约今天明天的教室,按着时间段预约(可多选),如果当前时间超过预约时间段不能预约该时间段的教室 预约教室的时候要有个预约用途ÿ…...
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࿰…...
常用Git命令记录
持续补充… git add:提交到暂存区git remote add <remote_name> <remote_url> : 添加一个新的远程仓库。指定一个远程仓库的名称和 URL,将其添加到当前仓库中。git commit:暂存区提交到本地仓库;-m:添加日…...
Go语言常用库
Go语言常用库 文本主要介绍Go常用的一些系统库: 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二叉树的性能: 搜索二叉树的应用k 模型kv模型 1.内容安排说明 二叉树在前面c数据结构阶段;已经讲过了;本节取名二叉树进阶的原因是: 1.map和set特…...
基于KDTree的机器学习壁面函数:提升CFD湍流模拟精度与效率
1. 项目概述在计算流体力学(CFD)的湍流模拟领域,尤其是处理高雷诺数工程流动时,近壁面区域的精确建模一直是个核心挑战。直接对粘性底层进行网格解析(Wall-Resolved LES/DES)虽然精度高,但计算成…...
Android系统级证书注入:突破HTTPS抓包限制的完整方案
1. 这不是“换个证书”那么简单:为什么系统级证书安装成了Android抓包真正的分水岭你肯定试过在Android手机上用Charles抓包——App打开,Charles配好代理,手机Wi-Fi设好代理地址,点开浏览器,流量哗哗进来了。但一打开微…...
【字节跳动】Robix系统的底层技术参数与源码机密档案
Robix 底层机密续档 纯裸数据无修饰一、内存寻址原生源码#define MEM_BASE_ADDR 0x80000000#define MEM_LIMIT_MASK 0x00000000uint64_t mem_unlock_range(uint64_t start,uint64_t end){mmu_page_protect_clear();high_addr_space_open();cache_origin_mode();dma_direct_acce…...
SLAM技术路线收敛?不,多模态融合正在重启路线之争
过去几年,SLAM技术路线确实呈现出明确的收敛趋势:纯视觉SLAM逐渐成熟,基于3DGS的实时建图成为新范式,激光SLAM也固化为工业场景的稳健选择。大家一度认为,算法架构的选择题已经做完。然而,多模态融合的深入…...
Alibaba组件选型与架构设计
Alibaba组件选型与架构设计 前言 本文将总结Spring Cloud Alibaba各组件的特点,并根据不同业务场景提供选型建议和架构设计指导。 一、组件对比与选型 1.1 注册中心对比 特性NacosEurekaConsulCAP模型CP/AP可切换APCP多语言支持HTTP/DNSHTTPHTTP/DNS配置管理原生支持…...
企业里大量重复性工作正在拖垮效率,你是否也深陷其中?2026年企业级Agent全场景落地指南
进入2026年,企业数字化转型已从“工具竞赛”转向“效能质变”。 尽管各种SaaS、ERP系统早已普及,但一个诡异的悖论依然存在: 系统越多,跨系统的搬运工作反而越多。 大量员工仍深陷在数据录入、报表核对、系统比对等机械性重复劳动…...
【限时公开】我们压测了23个开源AI Agent框架,仅2个支持亚秒级SQL生成+自动schema纠错(测试报告PDF已备)
更多请点击: https://codechina.net 第一章:AI Agent数据分析应用 AI Agent 正在重塑数据分析的范式——它不再依赖人工编写 SQL 或手动配置 ETL 流程,而是通过自然语言理解任务意图、自主调用工具、迭代验证结果,并生成可解释的…...
Seraphine:你的英雄联盟智能助手,3大核心功能提升游戏决策力
Seraphine:你的英雄联盟智能助手,3大核心功能提升游戏决策力 【免费下载链接】Seraphine 英雄联盟战绩查询工具 项目地址: https://gitcode.com/gh_mirrors/se/Seraphine 想象一下这样的场景:你刚刚进入英雄联盟的排位赛BP阶段&#x…...
UE5官方文档(第一人称射击游戏教程)解读 第七章
好了,今天来到我们的第七章,今天将承上启下,延伸输入部分的工作。 配置角色移动 Coder 03 Configure Character Movement with C in Unreal Engine | Unreal Engine 5.7 Documentation | Epic Developer Community // Copyright Epic Games…...
SeaweedFS S3网关实战:用s3cmd管理你的对象存储(从配置到常用命令)
SeaweedFS S3网关实战:从零构建高效对象存储工作流 在云原生技术蓬勃发展的今天,轻量级、高性能的对象存储解决方案正成为开发者工具箱中不可或缺的一环。SeaweedFS凭借其简洁的架构和出色的性能,逐渐在中小规模存储场景中崭露头角。本文将带…...
