在go语言中,也有接口的定义。但是和其他语言不同的是,go语言的接口比较“特殊”。。。

定义

接口是一个或者多个方法签名的集合,它之后方法的定义,没有方法的实现,也不能在其中定义字段。

// interface.go
package mainimport ("fmt"
)type IUSB interface {GetName() stringConnect()
}func main() {fmt.Println("Hello World!")
}

实现接口

在go语言中,通过定义类型来实现接口。实现接口的时候,无需显示指定实现了那个接口(这与其他语言不同),只需要定义出所需实现接口的所有方法即可。我们成这种方式为(Structural typing).

// interface.go
package mainimport ("fmt"
)type IUSB interface {GetName() stringConnect()
}type CellPhoneUSB struct {Name string
}func (cp CellPhoneUSB) GetName() string {return cp.Name
}func (cp CellPhoneUSB) Connect() {fmt.Println("cell phone connected...", cp.Name)
}func main() {var a IUSBa = CellPhoneUSB{"myCellPhone"}a.Connect()
}

我们先看下输出结果:

可以看到,我们定义了一个类型是CellPhoneUSB,它实现了IUSB中的两个方法GetName()和Connect().

在main函数里面,我们定义了一个变量a,它的类型是接口IUSB,然后我们将a转换成为一个type(CellPhoneUSB),在此之后,我们调用了类型CellPhoneUSB的connect方法。

接口嵌套

当我们需要将明确接口的层次结构的时候,就需要使用接口的嵌套。例如

type Connector interface {Connect()
}type IUSB interface {GetName() stringConnector
}

类型判断

有时候,由于我们实现的类型是实现了某种嵌套的接口,这时就需要我们进行类型判断。 闲话少说,上code

// interface.go
package mainimport ("fmt"
)type Connector interface {Connect()
}type IUSB interface {GetName() stringConnector
}type CellPhoneUSB struct {Name string
}func (cp CellPhoneUSB) GetName() string {return cp.Name
}func (cp CellPhoneUSB) Connect() {fmt.Println("cell phone connected...", cp.Name)
}func Disconnect(connector Connector) {if pc, ok := connector.(CellPhoneUSB); ok {fmt.Println("disconnected ...", pc.Name)}fmt.Println("type unknown!")
}func main() {var a IUSBa = CellPhoneUSB{"myCellPhone"}a.Connect()Disconnect(a)
}

我们定义了一个Disconnect的方法,在其中需要判断是否为指定的类型(CellPhoneUSB), 这里使用了表达式语句

if pc, ok := connector.(CellPhoneUSB); ok {   ...}

:= 的右边是 ->  类型实例.(期望类型)

空接口与type-switch

go语言允许我们使用空接口来模拟类似object类型的类型。此时,判断类型实现了那个接口就稍显复杂。不过我们可以用type-swtich语句来处理。

func GetType(obj interface{}) {switch result := obj.(type) {case CellPhoneUSB:fmt.Println("It is a cell phone usb", result.Name)default:fmt.Println("Unknown type...")}
}

使用接口的规则

1. 调用接口传入对象时,无论怎样定义,都是对象的 copy, 因此,无法改变原对象。

2. 只有当接口存储的类型和对象都为nil时,接口才等于nil。


转载于:https://www.cnblogs.com/atuotuo/p/7048778.html

Go - interface相关推荐

  1. Go 学习笔记(71)— Go 接口 interface (接口定义、接口实现、接口调用、值接收者、指针接收者)

    1. 接口的定义 接口是和调用方的一种约定,它是一个高度抽象的类型,不用和具体的实现细节绑定在一起.接口要做的是定义好约定,告诉调用方自己可以做什么,但不用知道它的内部实现,这和我们见到的具体的类型如 ...

  2. Static interface methods are only supported starting with Android N (--min-api 24): void okhttp3.log

    错误内容如下 Error: Static interface methods are only supported starting with Android N (--min-api 24): vo ...

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

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

  4. Go 学习笔记(4)— Go 标识符、数据类型之间转换、布尔型、整型、浮点型、interface 类型

    1. 标识符整体分类 Go 标识符整体分类如下图所示: 2. 数据类型分类 Go 语言按类别有以下几种数据类型: 类型 描述 布尔型 布尔型的值只可以是常量 true 或者 false 数字类型 整型 ...

  5. php 类 接口的区别吗,PHP的接口类(interface)和抽象类(abstract)的区别

    /** * 接口类:interface * 其实他们的作用很简单,当有很多人一起开发一个项目时,可能都会去调用别人写的一些类, * 那你就会问,我怎么知道他的某个功能的实现方法是怎么命名的呢,这个时候 ...

  6. java interface list_你了解注解内的@interface List么

    Annotation, Multi-valued annotation, nested annotation, 多值注解, 嵌套注解 今天在研究Spring MVC的Validation机制时(这里 ...

  7. TypeScript学习笔记之 接口(Interface)

    在java中,接口是用来定义一些规范,使用这些接口,就必须实现接口中的方法,而且接口中的属性必须是常量. javascript中是没有接口的概念的.所以TypeScript在编译成 JavaScrip ...

  8. 演示:思科IPS在线模式下Inline Interface Mode的响应行为(区别各个防御行为)

    演示:思科IPS在线模式下Inline Interface Mode的响应行为 演示目标:科IPS在线模式下InlineInterface Mode的响应行为. 演示环境:仍然使用图5.16所示的网络 ...

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

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

  10. interface IEngineControl封装引擎通用操作

    using System; using System.Collections.Generic; using System.Text; using System.Linq; namespace SIAT ...

最新文章

  1. 数据结构之【数组和广义表】复习题
  2. laravel 安装配置前准备
  3. Memcached安装
  4. UVA - 12166 Equilibrium Mobile
  5. 编程游戏python我的世界_乐学Python编程-做个游戏很简单
  6. uva 10479——The Hendrie Sequence
  7. 团队管理新思考_需要一个新的空间来思考讨论和行动
  8. linux 性能测试iostat,Linux性能分析之二(iostat)
  9. 教你如何做人的小故事
  10. oracle 列出asm磁盘,如何列出ASM磁盘组的所有磁盘
  11. amesim2020安装
  12. 如何除去word转pdf后出现的空白页
  13. QT_kvaser动态链接库配置
  14. Self-supervised Heterogeneous Graph Neural Network with Co-contrastive Learning 论文阅读
  15. quot;紫陀螺quot;网友感触转载系列之…
  16. 在个人隐私方面做得比Google好的搜索引擎——DuckDuckGo
  17. android widget的中文文档
  18. “移动互联网+”第一股 正益移动登陆新三板
  19. java lockmodetype_java – 如何使用Spring Data JPA查找实体时如何启用LockModeType.PESSIMISTIC_WRITE?...
  20. 【前端GUI】——网站设计的重要知识点总结思维导图(二)

热门文章

  1. 操作系统开发系列—2.进入32位保护模式
  2. Python 列表(List)操作方法详解
  3. 尾递归及示例(JAVA)
  4. go语言中的引用类型
  5. 十六进制字符转二进制字符
  6. UART0串口编程(一):通信协议设计;RS232标准
  7. 树莓派上搭建svn服务器
  8. spring:注解@Resource,实现引用类型的赋值
  9. 如何检查项目的需求是否完整
  10. Quartus11中新建工程