一、什么是接口

    • 接口类型是一种抽象的类型,它描述了一系列方法的集合。
    • 接口约定:接口类型中定义的方法即为约定,若一个具体类型实现了所有这些方法,则该类型就满足该接口的约定,或者说它是这个接口类型的实例(实现了该接口)。
    • 可替换性(LSP里氏替换):满足相同接口约定的类型之间可进行相互替换。例如:若一个方法的形参定义为接口类型,那么它可以接收任何满足该接口约定的类型的实参。
    • 接口内嵌:接口类型可通过组合已有的接口来定义
    • io.Writer接口提供了所有的类型写入bytes的抽象,包括文件类型,内存缓冲区,网络链接,HTTP客户端,压缩工具,哈希等等;io.Reader可以代表任意可以读取bytes的类型,io.Closer可以是任意可以关闭的值,例如一个文件或是网络链接。还有fmt.Stringer接口等
    • 接口类型名一般以“er”结尾

二、什么是接口值

    • 接口值:即接口变量的值,由两个部分组成,一个具体的类型和那个类型的值。它们被称为接口的动态类型和动态值
    • 接口值的零值:动态类型type和对应的动态值value均为nil,如var w io.Writer
    • 空接口值:当且仅当接口的动态类型type和对应的动态值value均为nil时,才为空接口值,此时它等于nil
    • 接口变量的赋值与调用过程:
      • 如w = os.Stdout,这个赋值过程调用了一个具体类型到接口类型的隐式转换,这和显式的使用io.Writer(os.Stdout)是等价的。这个接口值w的动态类型被设为*os.Stdout指针的类型描述符,它的动态值持有os.Stdout的拷贝
      • 调用一个包含*os.File类型指针的接口值的Write方法,w.Write([]byte("hello")) ,使得(*os.File).Write方法被调用
    • 一个接口值可以持有任意大的动态值,不论动态值多大,接口值总是可以容下它
    • 接口值的可比较性:
      • 时刻记住:只能比较动态类型是可比较类型的接口值。
      • 如果接口值的动态类型是可比较的,那么它们之间就可以使用==和!=来进行比较:两个接口值相等仅当它们都是nil值或者它们的动态类型相同并且动态值也根据这个动态类型的==操作相等。
      • 如果接口值是可比较的,那么它们可以用在map的键或者作为switch语句的操作数
      • 非接口类型要么是安全的可比较类型(如基本类型和指针)要么是完全不可比较的类型(如切片,映射类型,和函数),但是在比较接口值或者包含了接口值的聚合类型时,我们必须要意识到潜在的panic。同样的风险也存在于使用接口作为map的键或者switch的操作数。
    • 注意:一个包含nil指针的接口不是nil接口(空接口),此时调用接口方法会发生panic错误。即一个接口值的动态类型type != nil,但动态值value == nil,此时的接口值 w != nil。(当把一个值为nil的非接口类型的变量转换为接口类型时,即出现这种情况)
    • 技巧:使用接口时,直接声明一个接口类型的变量,然后再对它赋值,之后使用该变量时,就可以直接把它和nil比较来判断是否为空接口

Go的接口总结的更多相关文章

  1. App开发:模拟服务器数据接口 - MockApi

    为了方便app开发过程中,不受服务器接口的限制,便于客户端功能的快速测试,可以在客户端实现一个模拟服务器数据接口的MockApi模块.本篇文章就尝试为使用gradle的android项目设计实现Moc ...

  2. 干货来袭-整套完整安全的API接口解决方案

    在各种手机APP泛滥的现在,背后都有同样泛滥的API接口在支撑,其中鱼龙混杂,直接裸奔的WEB API大量存在,安全性令人堪优 在以前WEB API概念没有很普及的时候,都采用自已定义的接口和结构,对 ...

  3. 12306官方火车票Api接口

    2017,现在已进入春运期间,真的是一票难求,深有体会.各种购票抢票软件应运而生,也有购买加速包提高抢票几率,可以理解为变相的黄牛.对于技术人员,虽然写一个抢票软件还是比较难的,但是还是简单看看123 ...

  4. Java基础Map接口+Collections工具类

    1.Map中我们主要讲两个接口 HashMap  与   LinkedHashMap (1)其中LinkedHashMap是有序的  怎么存怎么取出来 我们讲一下Map的增删改查功能: /* * Ma ...

  5. Java基础Map接口+Collections

    1.Map中我们主要讲两个接口 HashMap  与   LinkedHashMap (1)其中LinkedHashMap是有序的  怎么存怎么取出来 我们讲一下Map的增删改查功能: /* * Ma ...

  6. java基础_集合List与Set接口

    List接口继承了Collection的方法  当然也有自己特有的方法向指定位置添加元素   add(索引,添加的元素); 移除指定索引的元素   remove(索引) 修改指定索引的元素   set ...

  7. 【WCF】自定义错误处理(IErrorHandler接口的用法)

    当被调用的服务操作发生异常时,可以直接把异常的原始内容传回给客户端.在WCF中,服务器传回客户端的异常,通常会使用 FaultException,该异常由这么几个东东组成: 1.Action:在服务调 ...

  8. PHP以接口方式实现多重继承(完全模拟)--学习笔记

     1.UML类图: 2.PHP代码: <?php /** * Created by PhpStorm. * User: andy * Date: 16-11-23 * Time: 下午7:57 ...

  9. 【微框架】Maven +SpringBoot 集成 阿里大鱼 短信接口详解与Demo

    Maven+springboot+阿里大于短信验证服务 纠结点:Maven库没有sdk,需要解决 Maven打包找不到相关类,需要解决 ps:最近好久没有写点东西了,项目太紧,今天来一篇 一.本文简介 ...

  10. 【接口开发】浅谈 SOAP Webserver 与 Restful Webserver 区别

    接口,强大,简单,交互,跨越平台 下面简单阐述这两大接口思想 一 REST: REST是一种架构风格,其核心是面向资源,REST专门针对网络应用设计和开发方式,以降低开发的复杂性,提高系统的可伸缩性. ...

随机推荐

  1. [linux] ubuntu 切换默认的/bin/sh

    [linux] ubuntu 切换默认的/bin/sh 背景 ubuntu 默认的sh, 也就是/bin/sh默认被切换成了dash,dash体积相对于bash更小,并且性能相对于bash更好, 但是 ...

  2. JavaScript 放置在文档最后面可以使页面加载速度更快

    JavaScript 放置在文档最后面可以使页面加载速度更快

  3. C#成员设计建议

    所谓成员,是指类型的字段和方法.在成员设计时,掌握一定原则可以避免设计上的陷阱. 1.不要为抽象类提供公开的构造方法 抽象类可以有构造方法,但是抽象类不能实例化.如果编程人员没有制定构造方法,编译器会 ...

  4. Razor TagHelper实现Markdown转HTML

    Markdown是一种可以使用普通文本编辑器编写的标记语言,通过简单的标记语法,它可以使普通文本内容具有一定的格式. 用途 Markdown的语法简洁明了.学习容易,而且功能比纯文本更强,因此有很多人 ...

  5. ZKEACMS 模板组件扩展

    前言 如果你还不知道ZKEACMS,不妨先了解一下. ASP.NET MVC 开源建站系统 ZKEACMS 推荐,从此网站“拼”起来 官方地址:http://www.zkea.net/zkeacms ...

  6. WebStrom创建自定义后缀名的文件

    如下图所示,我在下面的项目里面创建了.ejs文件,但是正常的情况下我们WebStrom是无法创建.ejs文件的,那么我们怎么才能让我们的WebStrom拥有创建该后缀名的文件的能力呢? 不BB,直接看 ...

  7. VSM Import Cluster功能验证二(导入篇)

    三 vsm import cluster 3.1登录vsm web UI 登陆 VSM web UI,https://172.16.34.51/dashboard/vsm/,点击Cluster Man ...

  8. ie7 a标签强制不换行兼容问题

    a内容错乱如图所示: 解决方法:加个样式就行white-space:nowrap;  最终效果图: 添加了white-space:nowrap 之后, 这样就强制一段文字不会自动换行了.

  9. 【maven】---初识

    前言 最近在研究自动化测试,其中的一个研究点儿就是maven,去download了一本书,看了看.下面是自己的从书中摘录的一些关于maven的概念性的东西. 内容 maven是什么? Maven是一个 ...

  10. python 绘制抛物线

    %matplotlib inlineimport matplotlib.pyplot as plt import numpy as npx = range(100) y = [val**2 for v ...