(三十四)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)定义一个学英语的接口,让足球运动员和大学生实现,具有一定的规范性;
继承和接口的解决问题不同:
继承:解决代码的复用性和可维护性;
接口:设计,设计好各种规范,让其他自定义类型去实现这些方法;接口更加灵活;在一定程度上实现代码解耦;
(三十四)golang--接口的更多相关文章
- spring boot 常见三十四问
Spring Boot 是微服务中最好的 Java 框架. 我们建议你能够成为一名 Spring Boot 的专家. 问题一 Spring Boot.Spring MVC 和 Spring 有什么区别 ...
- FreeSql (三十四)CodeFirst 迁移说明
FreeSql 支持 CodeFirst 迁移结构至数据库,这应该是(O/RM)必须标配的一个功能. 与其他(O/RM)不同FreeSql支持更多的数据库特性,而不只是支持基础的数据类型,这既是优点也 ...
- COJ966 WZJ的数据结构(负三十四)
WZJ的数据结构(负三十四) 难度级别:C: 运行时间限制:20000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 给一棵n个节点的树,请对于形如"u ...
- NeHe OpenGL教程 第三十四课:地形
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...
- JAVA之旅(三十四)——自定义服务端,URLConnection,正则表达式特点,匹配,切割,替换,获取,网页爬虫
JAVA之旅(三十四)--自定义服务端,URLConnection,正则表达式特点,匹配,切割,替换,获取,网页爬虫 我们接着来说网络编程,TCP 一.自定义服务端 我们直接写一个服务端,让本机去连接 ...
- Java进阶(三十四)Integer与int的种种比较你知道多少?
Java进阶(三十四)Integer与int的种种比较你知道多少? 前言 如果面试官问Integer与int的区别:估计大多数人只会说到两点:Ingeter是int的包装类,注意是一个类:int的初值 ...
- Gradle 1.12用户指南翻译——第三十四章. JaCoCo 插件
本文由CSDN博客万一博主翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Githu ...
- SQL注入之Sqli-labs系列第三十四关(基于宽字符逃逸POST注入)和三十五关
开始挑战第三十四关和第三十五关(Bypass add addslashes) 0x1查看源码 本关是post型的注入漏洞,同样的也是将post过来的内容进行了 ' \ 的处理. if(isset($_ ...
- “全栈2019”Java多线程第三十四章:超时自动唤醒被等待的线程
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- 第三百三十四节,web爬虫讲解2—Scrapy框架爬虫—Scrapy爬取百度新闻,爬取Ajax动态生成的信息
第三百三十四节,web爬虫讲解2—Scrapy框架爬虫—Scrapy爬取百度新闻,爬取Ajax动态生成的信息 crapy爬取百度新闻,爬取Ajax动态生成的信息,抓取百度新闻首页的新闻rul地址 有多 ...
随机推荐
- 如何将Azure SQL 数据库还原到本地数据库实例中
原文:https://www.jerriepelser.com/blog/restore-sql-database-localdb/ 原文作者: Jerrie Pelser 译文:如何将Azure S ...
- Day02stu
⦁ 环境搭建之接口测试工具Jmeter搭建 1) 什么是Jmeter? Jmeter是一个接口测试工具,基于Java开发,是是Apche公司使用Java平台开发的一款测试工具. 运行环境需要配置:JD ...
- 【总结】《氨基酸新晋管理者领导力培训》第一次课_Day2_学习心得
7月26日第二天学习心得: 今天主要学习了执行贯彻和绩效反馈两大块内容,我的心得有: 一.执行层面有两大原则:--理解员工需求: 回顾了一下自己以往的经历,一般这块我用的最多的一般是在接到一个新项目的 ...
- Java设计模式:Proxy(代理)模式
概念定义 代理模式是一种使用代理对象来执行目标对象的方法并在代理对象中增强目标对象方法的一种设计模式. 使用代理模式的原因有: 中介隔离作用:在某些情况下,一个客户类不想或者不能直接引用一个委托对象, ...
- .net 定时任务调度
前段时间开发个项目需要自定义时间定时发送邮件,此处使用了Quartz 定时任务,在此记录下: /// <summary> /// 创建定时任务 /// </summary> / ...
- git clone: HTTP Basic: Access denied 错误
git clone 报 HTTP Basic: Access denied 错误 解决方案: 1. 如果账号密码有变动 用这个命令 git config –-system –-unset creden ...
- jquery中的ajax请求到php(学生笔记)
首先ajax的基本语法基础.(必须得引入一个jquery文件,下面的例子展示用了网上的jquery文件,要联网.) 2.请求成功(复制代码运行观察效果) <!DOCTYPE html> & ...
- Java 包的使用
Java 包 Java面向对象的核心的概念:类.接口.抽象类.对象:[主体] 包的定义: 指的是一个程序的目录,在最早的时候,如果要开发一个程序,只需要定义一个Java文件,而后在这个文件中编写所需要 ...
- SQLi-LABS Page-4 (Challenges) Less-54-Less-65
Less-54 union - 1 http://10.10.202.112/sqli/Less-54?id=-1' union select 1,2,group_concat(table_name) ...
- [转]English - 开口说话工具箱: 27个高频词单词
本文转自:https://blog.csdn.net/weixin_34247032/article/details/87125465 英语初学者注意力不要放在语法上, 首先要懂得如何让自己开口说英语 ...