Golang interface 接口的应用场景 使用细节

news2024/11/16 19:50:58

应用场景介绍


对初学者讲,理解接口的概念不算太难,难的是不知道什么时候使用接口,下面我例举几个应用场景:

1.说现在美国要制造轰炸机,武装直升机,专家只需把飞机需要的功能/规格定下来即可,然后让别的人具体实现就可。

要去写一个结构体,结构体里面有些方法·,这些方法让一个程序员去写肯定是不太好的,希望将每个人都动起来。可以找项目经理,项目经理去定义一个接口,大家去实现这个接口就完事了。这样就可以很好的控制管理项目的进度。

其实也就是取定义规范,其他人将规范实现即可。

你想要去排序,只需要取实现这个data接口就行了。 

其实也就是传入实现了interface接口的方法全部实现的,那么就可以去调用包里面的sort方法,将这个类型传入进去即可。 

sort包里面有一个Sort函数,sort里面接受data,它是一个接口。那么只要传进去的变量实现了接口Interface里面所有方法,传入进去,它自然就给你排序了。当你实现接口,那么Sort函数就会自动帮你实现排序。

如果如下所示,之前使用email发送告警信息,后面如果要换成dingding去发送告警,那么代码就需要改动。 

//如果产生了一个告警,将告警发送给相关的人
//email sms weixin

type EmailSender struct {

}

type DingDingSender struct {
	
}

func (e *EmailSender) Send(msg string) error {
	fmt.Println(msg)
	return nil
}

func (d *DingDingSender) Send(msg string) error{
	fmt.Println(msg)
	return nil
}

func test(e *EmailSender,msg string)  {
	e.Send(msg)
}

func main()  {
	sender := new(EmailSender)
	sender.Send("email send")
}

如果需要改动得修改如下,要将和email相关的代码全部修改,如果没有全部修改会导致编译的时候失败。

为了解决这种问题,可以定义接口,这些结构体有个特点就是都有Send方法,这样就可以定义只有Send方法接口,那么参数类型就可以使用接口类型。

如果定义了接口就方便多了,只需要改一个地方,也就是结构体实例化的地方即可

type Sender interface {
	Send(string) error
}

	sender := new(DingDingSender)
	test(sender,"dingding send")
	
    sender1 := new(EmailSender)
	test(sender1,"email send")

2.说现在有一个项目经理,管理三个程序员,功能开发一个软件,为了控制和管理软件,项目经理可以定义一些接口,然后由程序员具体实现。

项目经理只需要将接口定义好,剩下的让程序员a b c共同完成。这样就可以控制软件的开发进度。

 

 

注意事项和细节


1)接口本身不能创建实例,但是可以指向一个实现了该接口的自定义类型的变量(实例)

type interfaceA interface {
	Say()
}

type Student struct {
}

func (*Student) Say() {
	fmt.Println("I am a student")
}

func main() {
	var i interfaceA
	student := new(Student)
	i = student //结构体变量实现了接口的方法
	i.Say()
}

2)接口中所有的方法都没有方法体,即都是没有实现的方法。

3)在Golang中,一个自定义类型需要将某个接口的所有方法都实现,我们说这个自定义类型实现了该接口。

4)一个自定义类型只有实现了某个接口,才能将该自定义类型的实例(变量)赋给接口类型。

5)只要是自定义数据类型,就可以实现接口,不仅仅是结构体类型。

type interfaceA interface {
	Say()
}

type integer int

func (i *integer) Say() {
	fmt.Println("i地址为:", &i, "i的值为:", *i)
}

func main() {
	var i interfaceA
	var a integer = 5
	a.Say()
}

6)一个自定义类型可以实现多个接口

7)Golang接口中不能有任何变量

上面可以看到和传统的oop不一样,他是基于方法来实现的这个接口。而java这些它是显示实现的,必须显示的指定去实现哪个接口。而golang并不关心实现了哪个接口,只关心实现了哪个方法。

8)一个接口(比如 A接口)可以继承多个别的接口(比如 B,C接口),这时如果要实现A接口,也必须将B,C接口的方法也全部实现。

可以看到A接口里面有两个方法,相当于将这两个接口继承下来了。那么就要将继承下来的接口里面的方法和本身的方法都去实现。

9) interface类型默认是一个指针(引用类型),如果没有对interface初始化就使用,那么会输出nil(在传入参数的时候,比如结构体,传入的不是值类型,传入的是引用类型,也就是&struct{}

10)空接口interface没有任何方法,所以所有类型都实现了空接口(空接口其实就是一种数据类型,可以将任何的数据类型的变量赋值给空接口,如果参数是空接口的形参,那么意味着可以接受任何一种数据类型)

下面可以看到结构体默认实现了空接口,其他类型也可以,字符串整型这些都是可以的。

type T interface {
}

type student struct {
	age  int
	name string
}

func main() {
	s := &student{
		age:  10,
		name: "lucas",
	}
	var t T = s
	fmt.Println(reflect.TypeOf(t))
	fmt.Println(t)

	var t3 interface{} = s
	fmt.Println(t3)
}

*main.student
&{10 lucas}
&{10 lucas}

可以将任何的变量赋值给空接口

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

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

相关文章

​“FTX 传奇曾经大佬 SBF 的审判:密友出庭指控,陪审团选择延长,听证会揭示 “

备受期待的 FTX 创始人 SBF 刑事审判开始,引发了检方和辩方之间关于他在加密货币交易所垮台中所扮演角色的冲突。美国助理检察官塞恩雷恩(ThaneRehn)将 SBF 描述为一位前雄心勃勃的人物,过着建立在欺骗基础上的奢华生活方式。 SBF 的律师马克科…

逻辑回归评分卡

文章目录 一、基础知识点(1)逻辑回归表达式(2)sigmoid函数的导数损失函数(Cross-entropy, 交叉熵损失函数)交叉熵求导准确率计算评估指标 二、导入库和数据集导入库读取数据 三、分析与训练四、模型评价ROC曲线KS值再做特征筛选生成报告 五、行为评分卡模型表现总结 一、基础知…

【数据结构】初探时间与空间复杂度:算法评估与优化的基础

🚩纸上得来终觉浅, 绝知此事要躬行。 🌟主页:June-Frost 🚀专栏:数据结构 🔥该文章主要了解算法的时间复杂度与空间复杂度等相关知识。 目录: 🌏 时间复杂度&#x1f52d…

基于自私羊群优化的BP神经网络(分类应用) - 附代码

基于自私羊群优化的BP神经网络(分类应用) - 附代码 文章目录 基于自私羊群优化的BP神经网络(分类应用) - 附代码1.鸢尾花iris数据介绍2.数据集整理3.自私羊群优化BP神经网络3.1 BP神经网络参数设置3.2 自私羊群算法应用 4.测试结果…

苹果手机怎么备份所有数据?2023年iPhone 15数据备份常用的3种方法!

当苹果手机需要进行刷机、恢复出厂设置、降级iOS系统等操作时,我们需要将自己的iPhone数据提前进行备份。 特别是在苹果发布新iOS系统时,总有一些小伙伴因为升降级系统,而导致了重要数据的丢失。 iPhone中储存着重要的照片、通讯录、文件等数…

STM32--人体红外感应开关

本文主要介绍基于STM32F103C8T6和人体红外感应开关实现的控制算法 简介 人体红外模块选用HC-SR501人体红外传感器,人体红外感应的主要器件为人体热释电红外传感器。人体都有恒定的体温,一般在36~37度,所以会发出特定波长的红外线&#xff0…

windows系统服务管理命令sc

sc可以用于管理系统服务、计划任务、系统日志等方面,是不可或缺的神器。 基本用法 在命令提示符下输入sc命令,然后按回车键。 上图展示的是sc命令的使用方法,支持哪些参数实现哪些功能 要查看系统所有服务列表,包括它们是否正在…

基于入侵杂草优化的BP神经网络(分类应用) - 附代码

基于入侵杂草优化的BP神经网络(分类应用) - 附代码 文章目录 基于入侵杂草优化的BP神经网络(分类应用) - 附代码1.鸢尾花iris数据介绍2.数据集整理3.入侵杂草优化BP神经网络3.1 BP神经网络参数设置3.2 入侵杂草算法应用 4.测试结果…

Mac版快速切换工具:One Switch中文 for mac

One Switch是一款功能强大、体验极简的Mac菜单栏工具,适合需要频繁切换系统设置和启动应用程序的用户使用。通过它,用户可以更方便地完成日常操作,提高工作效率。 快速访问工具:One Switch提供了一个便捷的菜单栏图标,…

1700*C. Number of Ways(贪心前缀和)

Problem - 466C - Codeforces Number of Ways - 洛谷 解析: 首先判断所有数总和是否能被三整除。 之后遍历前缀和数组,如果某个位置的前缀和等于sum/3,则记录。 某个位置前缀和等于sum/3*2则记录答案。 注意由于分成三份,所以同…

出去重复的列值(关键词:distinct)

MySQL从小白到总裁完整教程目录:https://blog.csdn.net/weixin_67859959/article/details/129334507?spm1001.2014.3001.5502 语法格式: select distinct 列名 from 表名; 案例:查询emp表中,员工的职位(job),并去重…

第八章 排序 五、快速排序

目录 一、算法思想 二、例子 三、代码实现 四、验证 五、算法效率分析 1、时间复杂度 ​编辑 2、空间复杂度 3、小结 4、优化思路 5、稳定性 六、总结 一、算法思想 首先,选取一个数作为序列的基准数,分别定义序列的第一个数和最后一个数为l…

Go Gin Gorm Casbin权限管理实现 - 1. Casbin概念介绍以及库使用

1. 核心概念 核心配置中含两部分模型配置以及策略配置,给出两个示范配置,在此基础上对实际请求进行分析。 1.1 Model 模型文件,存储了请求定义(request_definition),策略定义(policy_definition),匹配规则(matchers)&a…

黑豹程序员-架构师学习路线图-百科:AJAX

文章目录 1、什么是AJAX2、发展历史3、工作原理4、一句话概括 1、什么是AJAX Ajax即Asynchronous(呃森可乐思) Javascript And XML(异步JavaScript和XML) 在 2005年被Jesse James Garrett(杰西詹姆斯加勒特&#xff09…

Yolov5 ONNX导出报错: export failure: Unsupported ONNX opset version: 17

目录 1.问题描述 1.1 报错1 : 1.2 报错 2 2.解决方案 介绍 ONNX(Open Neural Network Exchange)是一个用于机器学习模型的开放式标准,它旨在使不同的深度学习框架能够将训练好的模型在不同平台上无缝运行。它是由Microsoft和F…

第二课 前缀和、差分、双指针扫描

文章目录 第二课 前缀和、差分、双指针扫描lc1.两数之和--简单题目描述代码展示 lc11.盛最多水的容器--中等题目描述代码展示 lc15.三数之和--中等题目描述代码展示 lc42.接雨水--困难题目描述代码展示 lc53.最大子数组和--中等题目描述代码展示 第二课 前缀和、差分、双指针扫…

基于goravel的CMS,企业官网通用golang后台管理系统

2023年9月11日10:47:00 仓库地址: https://gitee.com/open-php/zx-goravel-website 框架介绍 Goravel SCUI 后端开发组件 go 1.20 Goravel 1.13 数据库 sql(使用最新日期文件) goravel\doc\sql_bak mysql 8.0 前端开发组件 scui 1.6.9 node v14.21.3 效果图…

凉鞋的 Unity 笔记 106. 第二轮循环场景视图Sprite Renderer

106. 第二轮循环&场景视图&Sprite Renderer 从这一篇开始,我们开始进行第二轮循环。 这次我们至少能够在游戏运行窗口看到一些东西。 首先还是在场景层次窗口进行编辑,先创建一个 Sprite,操作如下: 创建后,会在 Scene …

【锁的区别】C++线程库和POSIX线程库锁的区别

C线程库和POSIX线程库锁的区别 C线程库代码段的互斥:mutex、recursive_mutex、timed_mutex、recursive_timed_mutex互斥量mutex:直接进行lock()或者unlock()递归互斥锁recursive_mutex:可以多次加锁,意味着加几次锁就需要解几次锁…

华为MateBook13 2021款(WRTD-WFE9)原装出厂Win10系统工厂模式安装包(含F10智能还原)

下载链接:https://pan.baidu.com/s/1yL7jFbklrln0UqWqxQ7fcw?pwd9nm1 系统自带一键智能还原功能、带有指纹、声卡、显卡、网卡等所有驱动、出厂主题壁纸、系统属性华为专属LOGO标志、Office办公软件、华为电脑管家等预装程序 所需要工具:16G或以上的U…