news 2026/5/25 12:56:36

我的go学习笔记之接口

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
我的go学习笔记之接口

怎么创建

typeSpeakerinterface{//接口名 约定用er结尾DogSkr()sting//狗叫的方法,以及狗叫的方法的返回类型CatSkr()stringyeller//嵌入接口}

怎么用

简单例子

packagemainimport"fmt"// 1.创建类型typeDogstruct{Namestring}// 2.为类型创建方法func(dog*Dog)Speak()string{returndog.Name+"汪汪汪"}// 3.定义接口typeSpeakerinterface{Speak()string//方法签名}funcmain(){// 4.怎么用// Dog类型已经实现了Speaker中的全部方法,所以属于Dog类型的实例都可以用这个接口// 实例化一条狗dahuang:=Dog{Name:"dahuang"}// 把实例绑定到接口varDogSpeak Speaker=&dahuang//因为Speak方法用的指针类型接收器,所以这要用&dahuangresult:=DogSpeak.Speak()fmt.Println(result)}

真实的项目中

一, 作为函数接收的参数

接口往往被用来作为函数接收的参数
这样可以实现多态,实现解耦

就像手机的红外遥控一样 它不关心谁来按这个按钮 只要空调,电视,冰箱等等实现了红外协议就行 以后买家具,只需要买一个实现了红外协议的,压根不用改红外和换手机

比如,我们有一个OcrResult接口
有两种业务逻辑
一种时身份证的Ocr
一种是普通照片的Ocr

// OcrResult.gotypeOcrer interfasce{add()//新增ocr结果的方法update()//更新ocr结果的方法delete()//删除ocr结果的方法}// 把接口作为函数的参数funcOcrResult(ocr Ocrer)string{//其他地方调了OcrResult,然后OcrResult根据情况调add()或者update() 或者delete()来干活// 而不用关心是身份证调的还是普通照片调的// 以后再增级其他照片要ocr// 只要它实现了接口中的方法,就可以用OcrResult函数// 而OcrResult函数一行代码也不用改}
// IdCard.gotypeIdCardstruct{}// 实现了add()方法func(idcard*IdCard)add()string{// 具体业务逻辑}// 实现了update()方法func(idcard*IdCard)update()string{}// 实现了delete()方法func(idcard*IdCard)delete(string{}

同样的,普通照片也是
可能还有很多其他的照片也是的
如果想用这个接口,但是又不需要某一个方法
可以实现一个空方法,什么也不做

// CommonImg.goype IdCardstruct{}// 实现了add()方法func(idcard*IdCard)add()string{// 具体业务逻辑}// 实现了update()方法func(idcard*IdCard)update()string{// 空方法}// 实现了delete()方法func(idcard*IdCard)delete(string{//业务逻辑}
二,为了使用标准库中的接口

真实项目中
还有一种常见的是
为了使用标准库中的接口
需要实现接口的方法签名
比如:
Go 的 sort.Sort 函数要求传入的变量需要实现 sort.Interface (包含 Len, Less, Swap 三个方法)

对接口的理解

接口是方法签名的集合

类型无需显式声明实现了某个接口,只要它实现了接口中定义的所有方法,就自动满足该接口。
这样高层模块就不依赖具体的实现(谁来按那个遥控都行)

居然一个类型要用这个这接口
就必须实现接口中的所有方法
那接口就是越小越好,
抄一句:Rob Pike名言:“接口越大,抽象越弱”

接口嵌套
理解不了一点
把代码写出来吗,感觉很冗余,所以尽量不嵌套

packagemainimport"fmt"// 分别定义接口typeDogSpeakinterface{DogSkr()string}typeCatSpeakinterface{CatSkr()string}// 组合接口typeSpeakinterface{DogSpeak CatSpeak}// 定义类型// 狗类typeDogstruct{Mutestring}// 猫类typeCatstruct{Mutestring}// 人类typeMenstruct{Talkstring}// Dog的叫法func(dog*Dog)DogSkr()string{return"汪汪汪"}// Cat的叫法func(cat*Cat)CatSkr()string{return"喵喵"}// 人的叫法,都会叫func(men*Men)DogSkr()string{return"汪汪汪"}func(men*Men)CatSkr()string{return"喵喵"}// 只需要人实现了接口中包含的所有方法,那么就实现了这个接口funcmain(){// 实例化一个人xiaoming:=&Men{Talk:"汪汪汪,喵喵"}varMenTalk Speak=xiaoming fmt.Println(MenTalk.DogSkr())//学狗叫fmt.Println(MenTalk.CatSkr())//学猫叫}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/26 3:29:52

16、C++ 流性能优化与操作符使用指南

C++ 流性能优化与操作符使用指南 1. C++ 流性能优化 C++ 流的性能一直是大家关注的问题,不过随着时间推移,这个问题已经得到了很大程度的缓解。为了让 C++ 流达到最佳性能,可以采用以下优化方法: - 禁用 std::ios::sync_with_stdio :C++ 流默认会与标准 C 函数(如…

作者头像 李华
网站建设 2026/5/25 1:04:18

量子计算开发者的秘密武器:实现Q#与Python变量实时同步的3种方法

第一章:量子计算与Q#-Python协同开发概述量子计算作为下一代计算范式的代表,正逐步从理论研究走向工程实现。微软推出的Q#语言专为量子算法设计,结合Python的生态系统,开发者能够构建混合量子-经典计算程序,充分发挥两…

作者头像 李华
网站建设 2026/5/25 5:06:56

NISP证书有用吗?NISP含金量如何呢?

NISP资格证书含金量是非常大的。 中国信息安全测评中心进行国家信息安全水平测试,英语简称:NISP,一共有三个等级**(NISP一级、二级、三级)**。 致力于普及化信息安全意识,加快网络信息安全人才培养&#xf…

作者头像 李华
网站建设 2026/5/26 1:57:15

构建智能安防大脑:wvp-GB28181-pro与AI分析系统深度集成指南

构建智能安防大脑:wvp-GB28181-pro与AI分析系统深度集成指南 【免费下载链接】wvp-GB28181-pro 项目地址: https://gitcode.com/GitHub_Trending/wv/wvp-GB28181-pro 从被动监控到主动预警的业务变革 传统安防监控系统面临的核心困境是数据量与处理能力的不…

作者头像 李华
网站建设 2026/5/25 8:22:46

为什么你的智能Agent无法跨容器通信?:3个被忽略的关键配置

第一章:智能 Agent 的 Docker 容器互联在构建分布式智能系统时,多个智能 Agent 往往以独立服务的形式运行。Docker 提供了轻量化的隔离环境,使得每个 Agent 可以独立部署与扩展。实现这些 Agent 之间的高效通信,关键在于容器网络的…

作者头像 李华
网站建设 2026/5/25 16:43:34

Android自动化输入终极方案:ADBKeyBoard 5分钟完整指南

Android自动化输入终极方案:ADBKeyBoard 5分钟完整指南 【免费下载链接】ADBKeyBoard Android Virtual Keyboard Input via ADB (Useful for Test Automation) 项目地址: https://gitcode.com/gh_mirrors/ad/ADBKeyBoard 在日常Android自动化测试中&#xff…

作者头像 李华