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 语言接口 | 菜鸟教程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/31884.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

09-axios在Vue中的导入与配置

09-axios 前言首先简单了解什么是Axios?以上完成后就可以使用了 前言 我们接着上一篇文章 08-路由地址的数据获取 来讲。 下一篇文章 10-vuex在Vue中的导入与配置 首先简单了解什么是Axios? Axios是一个基于Promise 用于浏览器和 nodejs 的 HTTP 客户端…

百度文心智能体,创建属于自己的智能体应用

百度文心智能体平台为你开启。百度文心智能体平台,创建属于自己的智能体应用。百度文心智能体平台是百度旗下的智能AI平台,集成了先进的自然语言处理技术和人工智能技术,可以用来创建属于自己的智能体应用,访问官网链接&#xff1…

docker基础使用教程

1.准备工作 例子:工程在docker_test 生成requirements.txt文件命令:(使用参考链接2) pip list --formatfreeze > requirements.txt 参考链接1: 安装pipreqs可能比较困难 python 项目自动生成环境配置文件require…

通俗解释resultType和resultMap的区别

【 1 对于单表而言: 注:以下都是摘抄过来的,做了让自己更能理解的版本 如果数据库返回结果的列名和要封装的实体的属性名完全一致的话用 resultType 属性 如果数据库返回结果的列名(起了别名)和要封装的实体的属性名…

ArcGIS批量投影转换的妙用(地理坐标系转换为平面坐标系)

​ 点击下方全系列课程学习 点击学习—>ArcGIS全系列实战视频教程——9个单一课程组合系列直播回放 这次文章我们来介绍一下,如何巧妙用要素数据集来实现要素的批量投影。不需要ArcGIS的模型构建器与解决。 例如,有多个要素要将CGCS_2000地理坐标系投…

D触发器(D Flip-Flop)与D锁存器(D Latch)

1 基础概念 我们先来简单回顾一下D触发器(D flip-flop)和D锁存器(D latch)的概念,以及它们在数字电路中的作用。 1.1 D触发器(D Flip-Flop) D触发器是一种数字存储器件,它在时钟信号…

【VS Code 插件】SQLite 可视化插件

VScode 插件分享篇之sqlite可视化工具 项目经常用到SQLite这个轻量型数据库,于是乎,就想着找一个可视化工具,但是我有时候只是想方便预览数据 表,又不想安装额外的程序,那么这款插件很适合你。 用习惯VS Code的小伙伴…

HarmonyOS Next 系列之沉浸式状态实现的多种方式(七)

系列文章目录 HarmonyOS Next 系列之省市区弹窗选择器实现(一) HarmonyOS Next 系列之验证码输入组件实现(二) HarmonyOS Next 系列之底部标签栏TabBar实现(三) HarmonyOS Next 系列之HTTP请求封装和Token…

Win11 删除文件时提示“找不到该项目,请重试”的解决办法

1、Win R 打开运行窗口,输入 notepad 并回车打开文本文档(记事本)软件,如下图: 2、在文本文档(记事本)软件中复制粘贴以下代码,如下图: del /f /a /q \\?\%1 rd /s /q \\?\%1或DEL /F /A /Q \\?\%1 RD /S /Q \\?…

红队内网攻防渗透:内网渗透之内网对抗:网络通讯篇防火墙组策略入站和出站规则单层双层C2正反向上线解决方案

红队内网攻防渗透 1. 内网网络通讯1.1 防火墙策略-入站规则&出站规则&自定义1.1.1 防火墙默认入站&出站策略1.1.2 防火墙自定义入站&出站策略1.1.3 内网域防火墙同步策略1.2 防火墙限制1.2.1 防火墙限制端口1.2.2 防火墙限制协议1.2.2.1 防火墙协议入站限制1.2…

html做一个分组散点图图的软件

在HTML中创建一个分组散点图,可以结合JavaScript库如D3.js或Plotly.js来实现。这些库提供了强大的数据可视化功能,易于集成和使用。下面是一个使用Plotly.js创建分组散点图的示例: 要添加文件上传功能,可以让用户上传包含数据的文…

昇思25天学习打卡营第4天|网络构建|函数式自动微分

学AI还能赢奖品?每天30分钟,25天打通AI任督二脉 (qq.com) 网络构建 神经网络模型是由神经网络层和Tensor操作构成的,mindspore.nn提供了常见神经网络层的实现,在MindSpore中,Cell类是构建所有网络的基类,也…

基于uni-app和图鸟UI的智慧农业综合管控平台小程序技术实践

摘要: 随着信息化技术的飞速发展,智慧农业已成为推动农业现代化、提升农业生产效率的重要手段。本文介绍了一款基于uni-app框架和图鸟UI设计的智慧农业综合管控平台小程序,该平台整合了传感器控制、农业数据监测、设施管控、农业新闻传播以及…

论文:R语言数据分析之机器学习论文

欢迎大家关注全网生信学习者系列: WX公zhong号:生信学习者Xiao hong书:生信学习者知hu:生信学习者CDSN:生信学习者2 一、研究背景 全球范围内,乳腺癌是导致癌症发病率和死亡率的主要疾病之一。根据2018年…

爬虫经典案例之爬取豆瓣电影Top250(方法二)

在上一篇文章的基础上,改进了代码质量,增加了多个正则表达式匹配,但同事也增加了程序执行的耗时。 from bs4 import BeautifulSoup import requests import time import re from random import randint import pandas as pdurl_list [https…

【MySQL 的三大日志的作用】

在管理MySQL数据库时,了解和区分数据库使用的三大日志类型至关重要。这些日志对于确保数据的完整性、提供恢复机制以及维持数据库的稳定性发挥着关键作用。最主要还是小豆前段时间去参加面试被问到了这些内容,下面将详细讨论Redo Log、Binlog和Undo Log的…

各种开发语言运行时占用内存情况比较

随着科技的发展,编程语言种类繁多,不同的编程语言在运行时的内存占用情况各不相同。了解这些差异对于开发者选择合适的编程语言尤为重要。本文将讨论几种主流编程语言在运行时的内存占用情况,包括C、C、Java、Python和Go等。 1. C语言 内存…

宏集物联网工控屏通过 S7 ETH 协议采集西门子 1200 PLC 数据

前言 为了实现和西门子PLC的数据交互,宏集物联网HMI集成了S7 PPI、S7 MPI、S7 Optimized、S7 ETH等多个驱动来适配西门子200、300、400、1200、1500、LOGO等系列PLC。 本文主要介绍宏集物联网HMI如何通过S7 ETH协议采集西门子1200 PLC的数据,文中详细介…

Element 进度条样式优化

在开发后台管理系统时,经常会用到进度条这样一个控件,Element UI中提供了progress这样一个组件,如下图所示: 该组件默认的颜色会比较单一,为此时常需要对该组件的样式进行一些优化,以满足实际项目的需求。 …

vue跳转页面 如果登录了直接跳转 没有登录登录完以后直接跳转,使用vuex管理登录状态

在Vue.js中,如果你需要在用户登录后重定向到他们原本想要访问的页面,你可以使用Vue Router的beforeEach守卫来实现这个功能。以下是实现这一需求的步骤: 存储目标路由:在用户被重定向到登录页面之前,存储他们想要访问的…