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--接口的更多相关文章

  1. spring boot 常见三十四问

    Spring Boot 是微服务中最好的 Java 框架. 我们建议你能够成为一名 Spring Boot 的专家. 问题一 Spring Boot.Spring MVC 和 Spring 有什么区别 ...

  2. FreeSql (三十四)CodeFirst 迁移说明

    FreeSql 支持 CodeFirst 迁移结构至数据库,这应该是(O/RM)必须标配的一个功能. 与其他(O/RM)不同FreeSql支持更多的数据库特性,而不只是支持基础的数据类型,这既是优点也 ...

  3. COJ966 WZJ的数据结构(负三十四)

    WZJ的数据结构(负三十四) 难度级别:C: 运行时间限制:20000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 给一棵n个节点的树,请对于形如"u  ...

  4. NeHe OpenGL教程 第三十四课:地形

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  5. JAVA之旅(三十四)——自定义服务端,URLConnection,正则表达式特点,匹配,切割,替换,获取,网页爬虫

    JAVA之旅(三十四)--自定义服务端,URLConnection,正则表达式特点,匹配,切割,替换,获取,网页爬虫 我们接着来说网络编程,TCP 一.自定义服务端 我们直接写一个服务端,让本机去连接 ...

  6. Java进阶(三十四)Integer与int的种种比较你知道多少?

    Java进阶(三十四)Integer与int的种种比较你知道多少? 前言 如果面试官问Integer与int的区别:估计大多数人只会说到两点:Ingeter是int的包装类,注意是一个类:int的初值 ...

  7. Gradle 1.12用户指南翻译——第三十四章. JaCoCo 插件

    本文由CSDN博客万一博主翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Githu ...

  8. SQL注入之Sqli-labs系列第三十四关(基于宽字符逃逸POST注入)和三十五关

    开始挑战第三十四关和第三十五关(Bypass add addslashes) 0x1查看源码 本关是post型的注入漏洞,同样的也是将post过来的内容进行了 ' \ 的处理. if(isset($_ ...

  9. “全栈2019”Java多线程第三十四章:超时自动唤醒被等待的线程

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  10. 第三百三十四节,web爬虫讲解2—Scrapy框架爬虫—Scrapy爬取百度新闻,爬取Ajax动态生成的信息

    第三百三十四节,web爬虫讲解2—Scrapy框架爬虫—Scrapy爬取百度新闻,爬取Ajax动态生成的信息 crapy爬取百度新闻,爬取Ajax动态生成的信息,抓取百度新闻首页的新闻rul地址 有多 ...

随机推荐

  1. linux 主机通过虚拟机(win10)上网

    公司内网必须安装安全软件(exe)才可以上网,但是我的系统是deepin,用deepin-wine无法安软该exe,于是用vmware安装了win10虚拟机,通过虚拟机上网 先简单介绍下vmware以 ...

  2. IT兄弟连 Java语法教程 数据类型 进制转换

    ●  正十进制转换为二进制 拆分法,将十进制整数拆分为若干个二进制权重的和,若有该权重则下面写1,否则写0.如: 34 = 32 + 2 128 64 32 16 8 4 2 1 0  0  1  0 ...

  3. PELT算法

    参考:http://www.wowotech.net/process_management/PELT.html 本文是对https://lwn.net/Articles/531853/的翻译 mark ...

  4. jQuery 源码分析(十四) 数据操作模块 类样式操作 详解

    jQuery的属性操作模块总共有4个部分,本篇说一下第3个部分:类样式操作部分,用于修改DOM元素的class特性的,对于类样式操作来说,jQuery并没有定义静态方法,而只定义了实例方法,如下: a ...

  5. 练手WPF(一)——模拟时钟与数字时钟的制作(中)

    今天接着制作数字时钟 数字时钟主要用到Path控件,主要用于定义数字笔划的形状. (1)添加一个DigitLine类 数字时钟的数字8由7笔组成,看如下定义的字段字符串数组PathDatas,每个st ...

  6. 二维码生成 Gma.QrCodeNet (目前测试支持.net4.0及以上,但vs版本2010不可以 NuGet中搜索不到程序包)

    1.添加程序包 2.生产二维码方法 #region 二维码 /// <summary> /// 生成二维码 /// </summary> /// <param name= ...

  7. go-GUI-代码

    直接看网址吧,所有的GO-GUI代码!~~~~ 网址

  8. jQuery的选择器总结

    jQuery的选择器 不会返回undefined或null 基本选择器 id选择器:$('#id') element选择器:$('elem') class选择器:$('.class') 通配符选择器: ...

  9. JavaScript深入浅出第1课:箭头函数中的this究竟是什么鬼?

    <JavaScript 深入浅出>系列: JavaScript 深入浅出第 1 课:箭头函数中的 this 究竟是什么鬼? JavaScript 深入浅出第 2 课:函数是一等公民是什么意 ...

  10. vuejs利用props,子组件修改父组件的数据,父组件修改子组件的的数据,数据类型为数组

    博文参考 传送们点一点 父组件: <template> <div> <aa class="abc" v-model="test" ...