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

go编程中接口(interface)用法

1、编程中多态的概念                                                                 

      如果熟悉C++编程,就会知道C++中可以通过虚函数来实现多态 ,Java等面向对象的语言也有类似的特性。那么是多态呢?

多态是面向对象编程中的一个基本概念,允许不同的类通过相同的接口实现不同的功能。简而言之,多态使得一个接口可以有多个实现,从而可以处理不同类型的对象,而无需知道它们的具体类型。

在 Go 语言中,多态主要通过接口实现。接口定义了一组方法,而不同的类型可以实现这些方法,从而实现接口。这样,可以使用接口类型的变量来引用实现了该接口的不同类型的对象。

                                                                                                                        --from chatGPT

多态是面向对象编程的一个概念,其核心相同的接口,具有不同的实现,从而达到调用相同的接口实现不同的功能。

(go语言由于没有这个概念,所以严格来讲,go中接口不能算是多态,但是核心思想是一样的。)

2、interface概念

        前面已经提到,go interface其实就是与多态相关的一个概念。

Go 语言提供了另外一种数据类型即接口,它把所有的具有共性的方法定义在一起,任何其他类型只要实现了这些方法就是实现了这个接口。

接口可以让我们将不同的类型绑定到一组公共的方法上,从而实现多态和灵活的设计。

Go 语言中的接口是隐式实现的,也就是说,如果一个类型实现了一个接口定义的所有方法,那么它就自动地实现了该接口。因此,我们可以通过将接口作为参数来实现对不同类型的调用,从而实现多态。

                                                                                                                -- from 菜鸟教程

3、用法举例

3.1 最简单的demo

为了让初学者有一个最直观的认识,先看一个最简单的demo:

package mainimport ("fmt"
)
// 定义一个接口,里面包含一个area方法
// 这里起始也可以包含多个方法
type Shape interface {area() float64
}
// 定义长方形结构体
type Rectangle struct {width  float64height float64
}
// 实现长方形结构体的area方法
func (r Rectangle) area() float64 {return r.width * r.height
}
// 定义圆结构体
type Circle struct {radius float64
}
// 实现圆的area方法
func (c Circle) area() float64 {return 3.14 * c.radius * c.radius
}func main() {// 定义一个接口变量var shape Shapeshape = Rectangle{width: 10, height: 5}fmt.Printf("矩形面积: %f\n", shape.area())shape =  Circle{radius: 3}fmt.Printf("圆形面积: %f\n",  shape.area())}

输出结果如下:

矩形面积: 50.000000
圆形面积: 28.260000

从上面可以看到,同一个接口方法area,由于不同的结构体具有不同的实现,从而不同的结构体对象调用同一个方法时,表现出各自的功能。

3.2 比较贴近实际业务案例

        在处理实际业务时,我们可能会根据接收到不同的消息,从而自动调用相关的方法进行处理。为此,我们需要先将不同的接口实现方法进行注册,然后根据不同的消息进行处理。

package mainimport "fmt"type Shape interface {area() float64
}type Rectangle struct {width  float64height float64
}func (r Rectangle) area() float64 {return r.width * r.height
}type Circle struct {radius float64
}func (c Circle) area() float64 {return 3.14 * c.radius * c.radius
}type Registry struct {shape map[int]Shape
}// 创建一个新的注册器
func NewRegistry() *Registry {return &Registry{shape: make(map[int]Shape)}
}// 注册处理函数
func (r *Registry) Register(id int, shape Shape) {r.shape[id] = shape
}func (r *Registry) Get(id int) Shape {return r.shape[id]
}
// 定义不同的消息ID
const (MSG_UNKNOW = 0MSG_RECTANGLE = 1MSG_CIRCLE = 2
)
func main() {//var s Shaperegistry := NewRegistry()// 注册不同的方法,将结构体类型与消息ID绑定,从而根据不同的消息ID调用不同的方法registry.Register(MSG_CIRCLE,  Circle{radius: 3})registry.Register(MSG_RECTANGLE, Rectangle{width: 10, height: 5})var msgId int// 假如收到的消息id为MSG_RECTANGLEmsgId = MSG_RECTANGLEr := registry.Get(msgId)fmt.Printf("面积: %f\n", r.area())
}

参考资料:

【1】Go 语言接口 | 菜鸟教程

相关文章:

  • springboot基于Web的社区医院管理服务系统 LW+ PPT+源码+讲解
  • 深入理解和实现Windows进程间通信(共享内存)
  • 防火墙规则来阻止攻击者的 IP 地址
  • Vim入门教程
  • 9、PHP 实现调整数组顺序使奇数位于偶数前面
  • 【CT】LeetCode手撕—300. 最长递增子序列
  • 手机在网状态-手机在网状态查询-手机在网站状态接口
  • wsl2平台鸿蒙全仓docker编译环境快速创建方法
  • Spring自定义标签体系和应用
  • 嵌入式软件stm32面试
  • 如何减少sql出现问题
  • MacOS设备远程登录配置结合内网穿透实现异地ssh远程连接
  • k8s及etcd的每日自动备份及故障时的还原脚本
  • windows环境下,怎么查看本机的IP、MAC地址和端口占用情况
  • day64 图论 图论理论基础 深搜 广搜 98. 所有可达路径
  • [数据结构]链表的实现在PHP中
  • axios请求、和返回数据拦截,统一请求报错提示_012
  • extract-text-webpack-plugin用法
  • gcc介绍及安装
  • Hexo+码云+git快速搭建免费的静态Blog
  • Java新版本的开发已正式进入轨道,版本号18.3
  • sublime配置文件
  • 高性能JavaScript阅读简记(三)
  • 京东美团研发面经
  • 前端性能优化--懒加载和预加载
  • 深度学习中的信息论知识详解
  • 世界上最简单的无等待算法(getAndIncrement)
  • 小程序开发之路(一)
  • Android开发者必备:推荐一款助力开发的开源APP
  • ​ ​Redis(五)主从复制:主从模式介绍、配置、拓扑(一主一从结构、一主多从结构、树形主从结构)、原理(复制过程、​​​​​​​数据同步psync)、总结
  • ​LeetCode解法汇总518. 零钱兑换 II
  • ‌分布式计算技术与复杂算法优化:‌现代数据处理的基石
  • #define用法
  • #Lua:Lua调用C++生成的DLL库
  • #数据结构 笔记三
  • #我与虚拟机的故事#连载20:周志明虚拟机第 3 版:到底值不值得买?
  • (23)mysql中mysqldump备份数据库
  • (html5)在移动端input输入搜索项后 输入法下面为什么不想百度那样出现前往? 而我的出现的是换行...
  • (ISPRS,2023)深度语义-视觉对齐用于zero-shot遥感图像场景分类
  • (SERIES10)DM逻辑备份还原
  • (二)JAVA使用POI操作excel
  • (翻译)Entity Framework技巧系列之七 - Tip 26 – 28
  • (附源码)ssm高校升本考试管理系统 毕业设计 201631
  • (附源码)ssm基于jsp的在线点餐系统 毕业设计 111016
  • (一)搭建springboot+vue前后端分离项目--前端vue搭建
  • (转) Face-Resources
  • (转)Spring4.2.5+Hibernate4.3.11+Struts1.3.8集成方案一
  • (转)原始图像数据和PDF中的图像数据
  • ***详解账号泄露:全球约1亿用户已泄露
  • .net CHARTING图表控件下载地址
  • .NET COER+CONSUL微服务项目在CENTOS环境下的部署实践
  • .NET MVC第三章、三种传值方式
  • .Net 应用中使用dot trace进行性能诊断
  • .NET/C# 使用 ConditionalWeakTable 附加字段(CLR 版本的附加属性,也可用用来当作弱引用字典 WeakDictionary)
  • .NET高级面试指南专题十一【 设计模式介绍,为什么要用设计模式】