接口是双方约定的一种合作协议。接口实现者不需要关心接口会被怎样使用,调用者也不需要关心接口的实现细节。

接口是一种类型,也是一种抽象结构,不会暴露所含数据的格式、类型及结构。

声明:

接口类型是由一组方法签名定义的集合

type 接口类型名 interface{

方法名1( 参数列表1 ) 返回值列表1

方法名2( 参数列表2 ) 返回值列表2

}

type Goer interface {write() (int,error)Read() error
}

var 接口名 接口类型名

var goer Goer

接口本身包含两个数据(值,类型),只有当两者都是nil时才为接口值才为nil

实现:

接口类型的变量可以保存任何实现了这些方法的值。

要求:

接口的方法与实现接口的类型方法格式一致

接口中所有方法均被实现

type Goer interface {write() float64
}
​
func main() {var goer Goerv := Vertex{3, 4}f := MyFloat(-3.14)//goer=v //编译错误,没有v Vertex的对应方法goer = &vfmt.Println(goer.write())goer = ffmt.Println(goer.write())
}
​
type MyFloat float64
​
func (f MyFloat) write() float64 {if f < 0 {return float64(-f)}return float64(f)
}
​
type Vertex struct {X, Y float64
}
​
func (v *Vertex) write() float64 {return math.Sqrt(v.X*v.X + v.Y*v.Y)
}

运行结果:

5

3.14

类型和接口之间有一对多和多对一的关系,一个类型可以同时实现多个接口,而接口间彼此独立,不知道对方的实现,同时一个接口的方法,不一定需要由一个类型完全实现,接口的方法可以通过在类型中嵌入其他类型或者结构体来实现

空接口:

指定了零个方法的接口值被称为空接口

由于每个类型的方法都至少实现了0种,所以不用指定方法,可以用来保存任何类型的值或者处理未知类型的值

interface{}

var a interface{}

例子:

func main() {var i interface{}describe(i)
​i = 42describe(i)
​i = "hello"describe(i)
}
​
func describe(i interface{}) {fmt.Printf("(%v, %T)\n", i, i)
}

输出结果:

(<nil>, <nil>)

(42, int)

(hello, string)

函数接口:

除了结构体和类型能实现接口,函数类型也可以实现接口

// 调用器接口
type Invoker interface {// 需要实现一个Call方法Call(interface{})
}
​
// 函数定义为类型
type FuncCaller func(interface{})
​
// 实现Invoker的Call
func (f FuncCaller) Call(p interface{}) {// 调用f函数本体
 f(p)
}
​
func main() {// 声明接口变量var invoker Invoker// 将匿名函数转为FuncCaller类型,再赋值给接口invoker = FuncCaller(func(v interface{}) {fmt.Println("from function", v)})// 使用接口调用FuncCaller.Call,内部会调用函数本体invoker.Call("hello")
}

运行结果:

from function hello

转载于:https://www.cnblogs.com/VingB2by/p/11119835.html

从零开始学Go之接口(一):接口相关推荐

  1. Java从零开始学二十三(集合Map接口)

    一.Map接口 Collection.Set.List接口都属于单值的操作,即:每次只能操作一个对象,而Map与它们不同的是,每次操作的是一对对象,即二元偶对象,Map中的每个元素都使用key à v ...

  2. java list 从0开始_Java从零开始学二十一(集合List接口)

    package com.pb.demo1; import java.util.LinkedList; import java.util.List; public class PersonLinkedL ...

  3. 从零开始学 Web 系列教程

    大家好,这里是「 从零开始学 Web 系列教程 」,并在下列地址同步更新-- github:https://github.com/Daotin/Web 微信公众号:前端队长 博客园:http://ww ...

  4. 天津工业大学19年计算机考研大纲,2019年天津工业大学《计算机原理及接口技术》考研复试大纲...

    2019年天津工业大学<计算机原理及接口技术>考研复试大纲已出,圣才考研网小编为大家整理了相关内容,欢迎大家点击查看!更多考研动态|模拟试题|历年真题请关注圣才考研网! 天津工业大学硕士研 ...

  5. 学成在线--1.CMS接口开发

    文章目录 0.定义CMS 1.CMS页面管理 2.需求分析 3.模型类介绍 4.定义请求及响应类型 5.定义接口 6.创建CMS工程结构 7.Dao 1)创建Dao,继承MongoRepository ...

  6. 【零基础学Java】—笔记本USB接口案例(二十八)

    [零基础学Java]-笔记本USB接口案例(二十八) 一.笔记本电脑 笔记本电脑(laptop)通常具备使用USB设备的功能,在生产时,笔记本都预留了可以插入USB设备的USB接口,但具体什么是USB ...

  7. 微型计算机排除语法错误,南京邮电大学《微机原理与接口技术》上机实验参考答案(四次全)...

    南京邮电大学<微型计算机原理与接口技术>上机实验答案.包含全部四次试验内容,涵盖汇编语言源程序和硬件连接指导等. 第 一次 实验1.3.1 "排除语法错误" 实验3.1 ...

  8. 第三次学JAVA再学不好就吃翔(part37)--接口概述

    学习笔记,仅供参考 文章目录 面向对象 接口 接口的概述及其特点 接口的成员特点 面向对象 接口 接口的概述及其特点 接口的概述 从狭义的角度讲就是指java中的interface 从广义的角度讲,对 ...

  9. java 多态 接口_从零开始的Java日常: 多态,抽象类,接口

    欢迎关注微博:@小白程序员的日常 欢迎关注微博超话:#小白程序员的日常# 本人目前在自学java,会不间断更新java知识 同为小白或者有大佬可以一起探讨一下 一.多态 1.什么是多态 同一个对象,在 ...

最新文章

  1. 驱动编程中的头文件与内核源码的关系
  2. 利用passssh,批量远程修改机器密码
  3. iOS: 在Object-C中监听javascript事件( Javascript communicating back with Objective-C code)
  4. java知识点总结(二)
  5. JDK与Java SE/EE/ME的区别
  6. Git 代码管理(代码提交和代码回退)
  7. tensorflow 获取checkpoint中的变量列表
  8. 2022年定位系泊系统市场深度分析及发展研究预测报告
  9. 安川机器人仿真软件MOTOSIM EG
  10. 风控项目2---风控建模流程
  11. 获取字符串的md5sum值——分别使用shell、python、c++实现
  12. php网页代码字体大小,html字体大小怎么设置
  13. vue中template的三种写法
  14. SLIC算法理解(仅为个人笔记)
  15. 1143-最长公共子序列的长度和最长公共子序列
  16. Android 自定义scheme及多端唤起使用方法
  17. 封闭式基金2021年收益战败指数-导致投资者寻求其他选择
  18. win10彻底禁用wsappx的方法
  19. google翻译逆天了逆天了(搞笑版)
  20. 雷蛇灯光配置文件_信仰绿轴?雷蛇RAZER黑寡妇蜘蛛X竞技版(背光款)点评

热门文章

  1. DNN 数据访问策略 (转)
  2. 一次次小进步,从毕业开始,你到现在飞跃了几次了,程序人生也不容易?
  3. 《计算机网络应用基础》模拟试卷(六),《计算机与网络应用基础知识1》模拟试卷...
  4. 批量新建文件夹并命名_dos命令实现批量新建文件夹
  5. mysql主从结构主数据库_mysql主从结构主数据库
  6. java i o不会的地方_Java I/O 好复杂,傻傻分不清楚,别担心,我们有线索了。。。...
  7. python如何创建一个类_python (知识点:类)简单的创建一个类
  8. net core mysql 连接池_EF Core 小坑:DbContextPool 会引起数据库连接池连接耗尽
  9. java tooltips_一款使用纯javacript编写的轻量级tooltips工具
  10. linux 修改mysql root密码_Linux mysql如何更改root密码