(三十四)golang--接口
时间:2022-07-23
本文章向大家介绍(三十四)golang--接口,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
golang的多态特性主要体现在接口上;
主要优势:高内聚低耦合;
package main
import (
"fmt"
)
type usb interface {
start()
stop()
}
type phone struct {
}
func (p phone) start() {
fmt.Println("手机开始工作")
}
func (p phone) stop() {
fmt.Println("手机停止工作")
}
type camera struct {
}
func (c camera) start() {
fmt.Println("相机开始工作")
}
func (c camera) stop() {
fmt.Println("相机停止工作")
}
type computer struct {
}
func (co computer) working(usb usb) {
usb.start()
usb.stop()
}
func main() {
computer := computer{}
phone := phone{}
camera := camera{}
computer.working(phone)
computer.working(camera)
}
接口的注意事项:
- 接口本身不能创建实例,但是可以指向一个实现了该接口的自定义类型的变量;
- 接口中的所有方法都没有方法体,即都是没有实现的方法;
- 一个自定义类型需要将某个接口的所有方法都实现;
- 一个自定义类型只有实现了某个接口,才能将该自定义类型的实例赋值给接口类型;
- 只要是自定义数据类型就可以实现接口,不仅仅是结构体类型;
- 一个自定义类型可以实现多个接口;
- 接口中不能有任何变量;
- 一个接口可以继承多个别的接口,这时如果要实现该接口,则必须实现继承来的所有接口中的方法;
- interface类型默认是一个指针,如果没有对Interface进行初始化就使用,就会输出nil;
- 空接口没有任何方法,所有数据类型都实现了空接口; var a interface{}
- 一个接口中不能有多个相同名字的方法;
接口的经典实例:实现对hero结构体切片进行排序;
golang中在sort包里面有一个Sort函数,可以定制自己的排序操作,只不过所传入的变量需要实现三个接口方法:Len、Less、Swap。其中Len()用于计算变量的长度,Less()指定对哪个字段进行排序,且按升序还是降序排序,Swap()用于交换两个变量的值。
接口和继承之间的关系?
接口是对继承的一种补充。通过接口,可以在不破坏原有父类属性和方法的基础上,给子类添加新的功能,同时这所有的功能也都可以继续被下一级所继承。
让我们捋一捋之间的关系:
- 首先,有一个monkey父类,包含属性:名字;
- littleMonKey继承了该类,获得了名字,它有属于自己的方法climbing;
- 但是flying和swimming本身并不属于littleMonkey,我们不能让它们变为littleMonkey的方法,于是我们实现了两个接口;这样littleMonkey得到了扩展;而flying和swimming仍然可以被其它的对象所使用;
- offspring继承了littleMonkey;offspring拥有monkey变量的属性:name,拥有littleMonkey的方法climbing,同时,它也拥有flying和swimming属性;
- 可以想象成,一直猴子生下了孙悟空,孙悟空虽然学会了飞和游泳,但并没有改变他还是猴子的事实,最后悟空的后代也可以学会飞和游泳,但也拥有猴子的特性;
在将一个例子,比如说有下面的关系:
我们想让足球运动员和大学生学英语:
(1)将英语写到运动员中,但是篮球运动员也能学英语了;
(2)将英语写到学生中,但是中学生也能学英语;
(3)将英语各自写到足球运动员和大学生中,有可能导致学英语的方法不一样;
(4)定义一个学英语的接口,让足球运动员和大学生实现,具有一定的规范性;
继承和接口的解决问题不同: 继承:解决代码的复用性和可维护性;
接口:设计,设计好各种规范,让其他自定义类型去实现这些方法;接口更加灵活;在一定程度上实现代码解耦;
- objective-C中的扩展方法与partial class
- 仿优酷Android客户端图片左右滑动(自动滑动)
- objective-C: NSString应该用initWithFormat? 还是 stringWithFormat?
- objective-C 的内存管理之-实例分析
- Tim Berners-Lee:网络的自由和开放
- android防止内存溢出浅析
- objective-C 的内存管理之-自动释放池(autorelease pool)
- objective-C 的内存管理之-引用计数
- CompoundButton.OnCheckedChangeListener与RadioGroup.OnCheckedChangeListener冲突
- Liora Rosin & Golan Levi:在北京驾车看洛杉矶的落日
- iphone/ipad/itouch进入DFU模式最简单的操作办法
- 微信小程序for循环里条件判断
- objective-C 的OOP(下)-类(static)方法、实例方法、overwrite(覆写)、属性(property)
- 你真的会玩SQL吗?删除重复数据且只保留一条
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Linux 全能系统监控工具dstat的实例详解
- 解决-BASH: /HOME/JAVA/JDK1.8.0_221/BIN/JAVA: 权限不够问题
- linux常用工具vi/vim的使用完整版
- Linux下监视NVIDIA的GPU使用情况详解
- Linux下安装jdk1.8并配置环境变量的教程
- Linux中Homebrew的正确使用方法
- Linux中awk的使用方法详解
- Django上线部署之Apache的方法
- centos7系统下python2与python3共存
- linux把一个文件的内容复制到另一个文件的末尾
- 详解linux下nohup日志输出过大问题解决方案
- K8S dashboard 2.0 安装配置并使用 ingress-nginx 访问
- linux模糊查找文件用什么命令比较好
- Ubuntu14.04服务器环境下配置PHP7.0+Apache2+Mysql5.7的方法
- Linux C 后台服务程序单进程控制的实现