2019独角兽企业重金招聘Python工程师标准>>>

#golang接口简介

go语言不是传统的面向对象语言,因此没有类和继承的概念。

go语言中的接口跟java中的接口有点类似,接口可以有多个实现。

go语言的接口是go的一种类型,用来指定一组方法(方法集),go的接口归根结底就是一个方法集合。

go语言实现接口的方式不像java一样用implements关键字来实现,而是只要实现了接口中的所有方法就认为是实现了接口,这是一种规范或者叫约定(隐式实现)。

go语言中的接口往往都很短,不会存在太多方法,一般只有0到5个。

#golang接口声明(定义)

type 接口名 interface {Method1(param_list) return_typeMethod2(param_list) return_type...
}

#golang接口使用

在Java中我们通过implements可以实现接口,那么在golang中怎么实现接口呢。

在go语言中并没有关键字来标识xx类型实现了xx接口,只是存在一个约定,当xx类型实现了接口中的所有方法,那么就说明该类型实现了xx接口。

注:即使接口在类型之后才定义,二者处于不同的包中,被单独编译:只要类型实现了接口中的方法,它就实现了此接口。

#golang接口实战 定义一个接口

type IHttpProxy interface {GET()POST()
}

实现一个接口

type HttpProxy struct {}func (httpProxy *HttpProxy) GET(){}func (httpProxy *HttpProxy) POST(){}

接口调用

var httpProxy IHttpProxy
httpProxy = new(HttpProxy)
httpProxy.GET()
httpProxy.POST()

#golang接口命名规范

一般情况下,如果接口只包含一个方法,那么接口一般都以er结尾。比如:Logger, Reader, Printer等等。

此外如果某个接口使用的单词本身以er结尾那么一般以able结尾,比如:Recorverable。

我们也可以像java中定义接口一样使用I打头。

#面向接口编程

在go中我们也可以像下面这种方式编程,方法接受参数是一个接口,我们可以传递任何一个实现了该接口的对象。

func invokeHttpGET(httpProxy IHttpProxy) {httpProxy.GET()
}func invokeHttpPOST(httpProxy IHttpProxy) {httpProxy.POST()
}

#golang接口嵌套

接口嵌套有点类似结构嵌套,就是在接口中直接引用接口。

例如下面的接口File包含了ReadWrite接口和Lock接口。

type ReadWrite interface {Read(b Buffer) boolWrite(b Buffer) bool
}type Lock interface {Lock()Unlock()
}type File interface {ReadWriteLockClose()
}

#golang类型判断

这里对接口的判断有点类似多态的意思。我们可以动态的判断当前接口类型的变量指向的到底是哪个实现。在Java中我们会有下面这种代码

Person p = new Man();
Person p2 = new Woman();
xxxMethod(Person person); //这个方法既可以接受Man也可以接受Woman。我们要在xxxMethod中判断到底是Man还是Woman,然后分别做出相应的处理。

那么在Go中我们怎么来实现这种判断呢? 通过表达式:v, ok := varI.(T);来表示,varI必须是一个接口变量,如果当前接口指向的是T类型,那么返回true否则返回false。如果是true,那么v就是完整的T类型。

####举个例子吧

var phone Phone
phone = new(NokiaPhone)
phone.call()
if t, ok := phone.(*NokiaPhone); ok {fmt.Printf("The type of areaIntf is: %T\n", t)
}phone = new(SumsangPhone)
phone.call()
if t, ok := phone.(*SumsangPhone); ok {fmt.Printf("The type of areaIntf is: %T\n", t)
}

####输出结果

I am Nokia, I can call you!
The type of areaIntf is: *interfaces.NokiaPhone
Sumsang call.
The type of areaIntf is: *interfaces.SumsangPhone

转载于:https://my.oschina.net/huaxian8812/blog/800326

golang之旅--接口 (interface)相关推荐

  1. Golang面向API编程-interface(接口)

    Golang面向API编程-interface(接口) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. Golang并不是一种典型的面向对象编程(Object Oriented Pr ...

  2. Go 学习笔记(35)— Go 接口 interface (接口声明、接口初始化、接口方法调用、接口运算、类型断言、类型查询、空接口)

    1. 接口概念 接口是双方约定的一种合作协议.接口实现者不需要关心接口会被怎样使用,调用者也不需要关心接口的实现细节.接口是一种类型,也是一种抽象结构,不会暴露所含数据的格式.类型及结构. 接口内部存 ...

  3. 初步解读Golang中的接口相关编写方法

    初步解读Golang中的接口相关编写方法 概述如果说goroutine和channel是Go并发的两大基石,那么接口是Go语言编程中数据类型的关键.在Go语言的实际编程中,几乎所有的数据结构都围绕接口 ...

  4. go struct 静态函数_Go语言学习笔记(四)结构体struct 接口Interface 反射reflect...

    加 Golang学习 QQ群共同学习进步成家立业工作 ^-^ 群号:96933959 结构体struct struct 用来自定义复杂数据结构,可以包含多个字段(属性),可以嵌套: go中的struc ...

  5. php中的抽象类(abstract class)和接口(interface)

    一. 抽象类abstract class 1 .抽象类是指在 class 前加了 abstract 关键字且存在抽象方法(在类方法 function 关键字前加了 abstract 关键字)的类. 2 ...

  6. 接口(Interface)的深入理解

    接口(Interface)的深入理解 一:接口是规范(不展开) 二:接口可以看成是一个特殊的类 1: 接口可以定义"接口类型变量",就好像类可以定义类类型的变量(或者说是引用类型变 ...

  7. Java接口interface

    Java接口interface 1.多个无关的类可以实现同一个接口. 2.一个类可以实现多个无关的接口. 3.与继承关系类似,接口与实现类之间存在多态性. 接口(interface)是抽象方法和常量值 ...

  8. golang中的接口

    接口 在go中,接口是一个自定义类型 接口类型是一个抽象类型,他不会暴露他代表的对象的内部值的结构和这个对象支持的基础操作的集合,他们只会展示出自己的方法.因此接口类型不能将他实例化 定义 type ...

  9. Java的类(class)、包(package)和接口(interface)

    在Java中,类(class)是用来代表对象的基本单元.对象(object)可以是现实世界中的任何一个实体,它具有若干区别于其它对象的属性和操作.而类则通过为对象定义属性和操作来概括一类实体.它封装了 ...

  10. Java接口(interface)的概念及使用

    在抽象类中,可以包含一个或多个抽象方法:但在接口(interface)中,所有的方法必须都是抽象的,不能有方法体,它比抽象类更加"抽象". 接口使用 interface 关键字来声 ...

最新文章

  1. ORB_SLAM2 PnPSolver
  2. 分形之闵可夫斯基(Minkowski)
  3. 关于MYSQL中like 检索汉字问题。
  4. echarts学习文档
  5. 卸载mongodb_【数据库】mongodb数据库安装
  6. JavaFX实际应用程序:SkedPal
  7. JPA与Hibernate的优缺点
  8. windows 10 应用商店无法下载安装应用的解决
  9. 多旋翼飞行器设计与控制(四) —— 动力系统建模与估计
  10. 使用java Graphics 绘图工具生成顺丰快递电子面单
  11. Windows系统改装成Linux系统
  12. 4.智能快递柜(通信篇-SOCKET)
  13. 采用腾讯云直播断流续播相关问题
  14. String 源码浅析————终结篇
  15. Chrome浏览器默认新标签页空白怎么办
  16. 服务器基本搭建(Linux系统阿里云服务器为例)-购买云服务器
  17. ViewModel 和 ViewModelProvider.Factory:ViewModel 的创建者
  18. VMware Bitfusion GPU共享技术的应用场景
  19. 【目标跟踪】帧差法结合卡尔曼滤波行人姿态识别【含GUI Matlab源码 1127期】
  20. java中super用来定义父类,定义子类必须使用的关键字是 在java中子类若要继承父类,需要使用的关键字是什么...

热门文章

  1. 风险管理那些事:当你身边有头“熊
  2. JS-商品图片点击轮换
  3. 从java 转到 c# 知识点
  4. java 多线程:开两个线程,一个线程跑同步代码块,一个线程跑同步函数
  5. iOS xcode ‘XXXX’ was compiled with optimization - stepping may behave oddly; variables may not be av
  6. Java课程设计---Eclipse基本环境配置
  7. MySQL使用内置函数来进行模糊搜索locate()与like的不同
  8. ASM:《X86汇编语言-从实模式到保护模式》第8章:实模式下硬盘的访问,程序重定位和加载...
  9. 多线程基础(三)NSThread基础
  10. Java事务处理全解析(三)——丑陋的案例