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

应用场景介绍


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

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

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

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

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

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

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

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

//如果产生了一个告警,将告警发送给相关的人
//email sms weixintype 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 interfaceAstudent := new(Student)i = student //结构体变量实现了接口的方法i.Say()
}

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

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

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

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

type interfaceA interface {Say()
}type integer intfunc (i *integer) Say() {fmt.Println("i地址为:", &i, "i的值为:", *i)
}func main() {var i interfaceAvar a integer = 5a.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  intname string
}func main() {s := &student{age:  10,name: "lucas",}var t T = sfmt.Println(reflect.TypeOf(t))fmt.Println(t)var t3 interface{} = sfmt.Println(t3)
}*main.student
&{10 lucas}
&{10 lucas}

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

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

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

相关文章

闲聊四种旅游方式

十一长假,先不写那些需要深度思考的话题,先写点轻松的。 关于旅游方式,其实也是受梁斌博士一条微博的一些触动,他说他认识个朋友,自由职业,到处旅游,却从不旺季出行,非常省钱&#x…

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

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

蓝桥等考Python组别十三级005

第一部分:选择题 1、Python L13 (15分) 运行下面程序,输出的结果是( )。 t = (1, 8, 3, 5, 4, 3, 2) print(t.count(3)) 012不输出任何内容正确答案:C 2、Python L13 (15</

微信开放平台第三方开发,实现代小程序备案申请

大家好&#xff0c;我是小悟 微信小程序备案整体流程总共分为五个环节&#xff1a;备案信息填写、平台初审、工信部短信核验、通管局审核和备案成功。 服务商可以代小程序发起备案申请。在申请小程序备案之前&#xff0c;需要确保小程序基本信息已填写完成、小程序至少存在一个…

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

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

推荐一款在线的JDK17中文文档

spring6.0及springboot3.0最低版本要求都是java17&#xff0c;换上java17是迟早的事&#xff0c;所以虽然我现在做的是java8&#xff0c;但是后面我想从java8直接飞升到java17&#xff0c;先做个准备&#xff0c;找到一个JDK17的中文文档&#xff0c;是在线的&#xff0c;地址&…

【小沐学Python】各种Web服务器汇总(Python、Node.js、PHP、httpd、Nginx)

文章目录 1、Web服务器2、Python2.1 简介2.2 安装2.3 使用2.3.1 http.server&#xff08;命令&#xff09;2.3.2 socketserver2.3.3 flask2.3.4 fastapi 3、NodeJS3.1 简介3.2 安装3.3 使用3.3.1 http-server&#xff08;命令&#xff09;3.3.2 http3.3.3 express 4、PHP4.1 简…

【MVC】C# MVC基础知识点、原理以及容器和管道

给自己一个目标&#xff0c;然后坚持一段时间&#xff0c;总会有收获和感悟&#xff01; 国庆假期马上结束&#xff0c;闲暇时间&#xff0c;重温一遍C#关于MVC的技术&#xff0c;控制器、视图、模型&#xff0c;知识点和原理&#xff0c;小伙伴们还记得吗 目录 一、MVC知识点1…

Python柱形图

柱形图 柱形图&#xff0c;又称长条图、柱状统计图、条图、条状图、棒形图&#xff0c;是一种以长方形的长度为变量的统计图表。长条图用来比较两个或以上的价值&#xff08;不同时间或者不同条件&#xff09;&#xff0c;只有一个变量&#xff0c;通常利用于较小的数据集分析…

深度迁移学习(Deep Migration Learning)

深度迁移学习&#xff08;Deep Transfer Learning&#xff09;是一种在深度学习领域中应用的迁移学习方法&#xff0c;旨在通过利用从一个领域学习到的知识来改善在另一个相关但数据较少的领域上的学习任务。深度迁移学习常常使用预训练的深度神经网络模型&#xff0c;通过迁移…

Android12 OTA编译差分包报错问题

前言 在Ubuntu 20.04.4 LTS系统中编译Android12 OTA差分包的时候提示如下报错log: Warning: releasetools script should be invoked as hermetic Python executable -- build and run ota_from_target_files directly. Traceback (most recent call last):File "./bu…

蓝桥等考Python组别十三级008

第一部分:选择题 1、Python L13 (15分) 运行下面程序,输出的结果是( )。 t = (1, 2, 4, 3, 1, 6, 2) print(t[3]) 2136正确答案:C 2、Python L13 (

用OpenCV(Python)获取图像的SIFT特征

import cv2 as cv import numpy as np import matplotlib.pyplot as plt imgcv.imread("../Lena.png") img_graycv.cvtColor(img,cv.COLOR_BGR2GRAY)#创建一个SIFI对象 siftcv.SIFT_create()#使用SIFT对象在灰度图像img_gray中检测关键点&#xff0c;结果存储在变量k…

迄今为止丨ChatGPT最强指令,一个可以让机器人生成机器人的Prompt,价值百万!

原文&#xff1a; 【ChatGPT调教】ChatGPT最强指令、让机器人为你生成机器人&#xff01;-CSDN博客 说明&#xff1a;最好看原文 昨天&#xff0c;发现了一条可能是迄今为止&#xff0c;我见过最牛的&#xff0c;商业价值最高的ChatGPT指令。 通过这条指令&#xff0c;可以…

windows系统服务管理命令sc

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

Ubuntu使用cmake和vscode开发自己的项目,引用自己的头文件和openCV

创建文件夹 mkdir my_proj 继续创建include 和 src文件夹&#xff0c;形成如下的目录结构 用vscode打开项目 创建add.h #ifndef ADD_H #define ADD_Hint add(int numA, int numB);#endif add.cpp #include "add.h"int add(int numA, int numB) {return numA nu…

程序人生 / 散文分享 / 生活感悟——【追光的日子】《爷爷的12本日历》,若你也共情,欢迎在评论区分享你的故事、观点、感悟和思考!

在一切变好之前,我们总要经历一些不开心的日子,这段日子也许很长,也许只是一觉醒来。有时候,选择快乐,更需要勇气。 🎯作者主页: 追光者♂🔥 🌸个人简介: 💖[1] 计算机专业硕士研究生💖 🌿[2] 2023年城市之星领跑者TOP1(哈尔滨)🌿 🌟[3]…

基于SpringBoot的视频网站系统

目录 前言 一、技术栈 二、系统功能介绍 用户信息管理 视频分享管理 视频排名管理 交流论坛管理 留言板管理 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 使用旧方法对视频信息进行系统化管理已经不再让人们信赖了&#xff0c;把现在的网络信息技术运…

《视觉 SLAM 十四讲》V2 第 5 讲 相机与图像

文章目录 相机 内参 && 外参5.1.2 畸变模型单目相机的成像过程5.1.3 双目相机模型5.1.4 RGB-D 相机模型 实践5.3.1 OpenCV 基础操作 【Code】OpenCV版本查看 5.3.2 图像去畸变 【Code】5.4.1 双目视觉 视差图 点云 【Code】5.4.2 RGB-D 点云 拼合成 地图【Code】 习题题…

Python数据容器——集合的相关操作

作者&#xff1a;Insist-- 个人主页&#xff1a;insist--个人主页 本文专栏&#xff1a;Python专栏 专栏介绍&#xff1a;本专栏为免费专栏&#xff0c;并且会持续更新python基础知识&#xff0c;欢迎各位订阅关注。 目录 一、理解集合 1. 集合是什么&#xff1f; 2. 为什么…