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

我的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())//学猫叫}
http://www.cnnetsun.cn/news/104438.html

相关文章:

  • MATLAB与XFoil翼型分析:终极集成指南
  • EmotiVoice语音合成在新闻播报自动化中的效率提升
  • 浏览器原生Python编程革命:JupyterLite深度解析与应用指南
  • Vue Query Builder 终极指南:快速构建可视化查询界面
  • 从零构建高可用Agent服务:Docker备份恢复的7步黄金流程
  • 网站域名没有被百度收录
  • echarts给饼图以及折线图悬浮提示框添加单位
  • 从文本到情感语音:EmotiVoice如何重塑语音合成新标准?
  • GEO对决传统SEO:AI搜索时代,品牌如何赢得“心智推荐”
  • 【专家级排错手册】:基于Docker Compose的Agent服务日志采集失败的7种场景与应对方案
  • 极简主义知识管理新体验:Obsidian Minimal主题完全使用指南
  • 如何在gem5-gpu上实现全系统仿真模式 full-system mode
  • 兼容为基,革新为核 —— 金仓数据库重塑企业数据库运维新体验
  • YOLOv12架构革命:通过UniRepLynne主干网络实现特征提取能力的代际飞跃**
  • NewGAN-Manager终极指南:足球经理头像配置一键生成
  • 38、深入探索Linux系统中的事件追踪工具
  • 震惊!这家外卖点单小程序开发公司,竟让客户排队抢着合作!
  • MATLAB进行图像分割从基础阈值到高级分割
  • Figma-Context-MCP完整使用指南:让AI助手秒懂你的设计意图
  • 【Docker Buildx镜像推送终极指南】:掌握多架构构建与高效推送的5大核心技巧
  • EvolveGCN实战宝典:从入门到精通的动态图神经网络完全指南
  • 你的WebRTC安全吗?深度解密Janus加密防护体系
  • 5、CoreOS 调试与自动更新全解析
  • 13、容器技术与CoreOS集成:标准、运行时与高级特性
  • 21、容器化与微服务基础设施的技术洞察与实践指南
  • 2、轻量级容器优化操作系统及CoreOS技术详解
  • 别瞎挖了!弱口令挖掘就这 3 招(1 字典 + 2 技巧),月入 5K 稳
  • 语音合成也能‘演戏’?EmotiVoice演绎悲伤与喜悦
  • 计算机专业,一定要考取这六个证书,手握一个薪资起码翻一倍,含金量高!从零基础到精通,收藏这篇就够了!
  • 如何快速上手YOLO目标检测:智能可视化工具完整教程