• 接口是一个或多个方法签名名的集合,定义方式如下

    type Interface_Name interface { method_a() string method_b() int .... }

  • 只要某个类型拥有该接口的所有方法签名,就算实现该接口,无需显示声明实现了那个接口,这称为structural Typing

    1. package main
    2. import "fmt"
    3. type USB interface { //定义一个接口:方法的集合
    4. Name() string //Name方法,返回string
    5. Connect() //Connect方法
    6. }
    7. type PhoneConnecter struct { //定义一个结构
    8. name string //结构包含一个字段
    9. }
    10. func (pc PhoneConnecter) Name() string { //为结构定义一个方法,绑定接口
    11. return pc.name //该方法命名为接口内的字段
    12. } //返回结构体字段
    13. func (pc PhoneConnecter) Connect() { //定义结构体另一个方法,与接口另一个方法绑定
    14. fmt.Println("Connect:", pc.name)
    15. }
    16. func main() {
    17. var a USB //定义一个变量为USB接口类型
    18. a = PhoneConnecter{"PhoneConnecter"} //实例化一个结构体,并赋值给变量(接口)USB
    19. a.Connect() //接口调用其Connect方法,也是结构方法
    20. }
    21. /*输出
    22. Connect: PhoneConnecter
    23. */
  • 接口可以作为匿名嵌入其它接口,或嵌入到结构中

    1. package main
    2. import "fmt"
    3. type USB interface { //定义一个接口:方法的集合
    4. Name() string //Name方法,返回string
    5. Connecter //嵌入Connecter接口,可以使用Connecter方法
    6. }
    7. type Connecter interface { //定义另一个接口 Connecter
    8. Connect() //包含一个接口方法:Connect
    9. }
    10. type PhoneConnecter struct { //定义一个结构
    11. name string //结构包含一个字段
    12. }
    13. func (pc PhoneConnecter) Name() string { //为结构定义一个方法,绑定接口
    14. return pc.name //该方法命名为接口内的字段
    15. } //返回结构体字段
    16. func (pc PhoneConnecter) Connect() { //定义结构体另一个方法,与接口另一个方法绑定
    17. fmt.Println("Connect:", pc.name)
    18. }
    19. func main() {
    20. var a USB //定义一个变量为USB接口类型
    21. a = PhoneConnecter{"PhoneConnecter"} //实例化一个结构体,并赋值给变量(接口)USB
    22. a.Connect()
    23. Disconnect(a) //接口调用其Connect方法,也是结构方法
    24. }
  • 接口只是方法声明,没有实现调用,没有字段,只能通过绑定的类型方法访问

    1. package main
    2. import "fmt"
    3. type USB interface { //定义一个接口:方法的集合
    4. Name() string //Name方法,返回string
    5. Connecter //嵌入Connecter接口,可以使用Connecter方法
    6. }
    7. type Connecter interface { //定义另一个接口 Connecter
    8. Connect() //包含一个接口方法:Connect
    9. }
    10. type PhoneConnecter struct { //定义一个结构
    11. name string //结构包含一个字段
    12. }
    13. func (pc PhoneConnecter) Name() string { //为结构定义一个方法,绑定接口
    14. return pc.name //该方法命名为接口内的字段
    15. } //返回结构体字段
    16. func (pc PhoneConnecter) Connect() { //定义结构体另一个方法,与接口另一个方法绑定
    17. fmt.Println("Connected:", pc.name)
    18. }
    19. func main() {
    20. var a USB //定义一个变量为USB接口类型
    21. a = PhoneConnecter{"htc M10"} //实例化一个结构体,并赋值给变量(接口)USB
    22. a.Connect()
    23. Disconnect(a) //接口调用其Connect方法,也是结构方法
    24. }
    25. func Disconnect(usb USB) {
    26. if pc, ok := usb.(PhoneConnecter); ok { //传入结构体,判断赋值是否成功
    27. fmt.Println("Disconnected:", pc.name)
    28. return
    29. }
    30. fmt.Println("UNknown device.")
    31. }
    32. /*输出
    33. Connect: htc M10
    34. Disconnect:htc M10
    35. */
  • go没有像其他语言继承,如python中的object表示元类,所有的类都继承自object类,go通过接口也类似实现了此定义,因为只要某个类型实现了某个接口的方法,我们就说此类实现了

    这个接口。 因为type empty interface{}---空接口没有任何方法,所以可以理解为所有的接口都实现了空接口的方法(继承)。

    1. package main
    2. import "fmt"
    3. type USB interface { //定义一个接口:方法的集合
    4. Name() string //Name方法,返回string
    5. Connecter //嵌入Connecter接口,可以使用Connecter方法
    6. }
    7. type Connecter interface { //定义另一个接口 Connecter
    8. Connect() //包含一个接口方法:Connect
    9. }
    10. type PhoneConnecter struct { //定义一个结构
    11. name string //结构包含一个字段
    12. }
    13. func (pc PhoneConnecter) Name() string { //为结构定义一个方法,绑定接口
    14. return pc.name //该方法命名为接口内的字段
    15. } //返回结构体字段
    16. func (pc PhoneConnecter) Connect() { //定义结构体另一个方法,与接口另一个方法绑定
    17. fmt.Println("Connected:", pc.name)
    18. }
    19. func main() {
    20. var a USB //定义一个变量为USB接口类型
    21. a = PhoneConnecter{"htc M10"} //实例化一个结构体,并赋值给变量(接口)USB
    22. a.Connect()
    23. Disconnect(a) //接口调用其Connect方法,也是结构方法
    24. }
    25. # func Disconnect(usb interface{}) { //集成空接口,也可以实现
    26. # if pc, ok := usb.(PhoneConnecter); ok { //传入结构体,判断赋值是否成功
    27. # fmt.Println("Disconnected:", pc.name)
    28. # return
    29. # }
    30. # fmt.Println("UNknown device.")
    31. # }
    32. //通过switch判断接口类型:type...switch用法
    33. func Disconnect(usb interface{}) { //集成空接口,也可以实现
    34. switch v := usb.(type) {
    35. case PhoneConnecter:
    36. fmt.Println("Disconnected:", v.name)
    37. default:
    38. fmt.Println("UNknown device.")
    39. }
    40. }
    41. /*输出
    42. Connect: htc M10
    43. Disconnect:htc M10
    44. */
  • 接口间的转换: 只有子类接口可以转换为父类接口,因为父类接口包含了子类接口,子类接口可以调用父类接口一部分接口方法

  • 将对象赋值给接口是,会发生拷贝,而接口内部存储的是只想这个复制品的指针,也就意味着接口无法修改状态,也无法获取指针。

    1. ...
    2. func main() {
    3. pc := PhoneConnecter{"ipad book pro"} //实例化一个结构
    4. var a Connecter //定义a为接口变量
    5. a = Connecter(pc) //接口强制转换
    6. a.Connect()
    7. pc.name = "Iphone 7"
    8. a.Connect()
    9. ...
    10. /*输出
    11. pc.name= "ipad book pro" Connected: ipad book pro
    12. pc.name = "Iphone 7" Connected: ipad book pro
    13. */
    14. }
  • 只有当 接口存储的类型和对象都为nil时,接口才等于nil

    1. package main
    2. import "fmt"
    3. func main() {
    4. var a interface{}
    5. fmt.Println(a == nil)
    6. var p *int = nil
    7. a = p
    8. fmt.Println(a == nil)
    9. }
    10. /*输出
    11. true
    12. false
    13. */
  • 接口调用不会做Receiver的自动转换

  • 接口同样支持匿名字段的方法

  • 接口也可以实现类似OOP(面向对象编程)中的多态

  • 空接口可以作为任何类型数据的容器

golang基础--Interface接口的更多相关文章

  1. Golang 之 interface接口全面理解

    什么是interface 在面向对象编程中,可以这么说:“接口定义了对象的行为”, 那么具体的实现行为就取决于对象了. 在Go中,接口是一组方法签名(声明的是一组方法的集合).当一个类型为接口中的所有 ...

  2. Golang基础(8):go interface接口

    一:接口概要 接口是一种重要的类型,他是一组确定的方法集合. 一个接口变量可以存储任何实现了接口方法的具体值.一个重要的例子就是io.Reader和io.Writer type Reader inte ...

  3. Golang 入门系列(四)如何理解interface接口

    前面讲了很多Go 语言的基础知识,包括go环境的安装,go语言的语法等,感兴趣的朋友,可以先看看之前的文章.https://www.cnblogs.com/zhangweizhong/category ...

  4. golang面向对象和interface接口

    一. golang面向对象介绍 1.golang也支持面向对象编程,但是和传统的面向对象编程有区别,并不是纯粹的面向对象语言.2.golang没有类(class),golang语言的结合体(struc ...

  5. Java基础-面向接口(interface)编程

    Java基础-面向接口(interface)编程 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.接口的概念 接口是功能的集合,同样可看做是一种数据类型,是比抽象类更为抽象的“类 ...

  6. java基础13 接口(及关键字:interface、implements)

    接口 1.接口的定义格式 interface 接口名{ } interface :接口的关键字 implements:实现接口的关键字 2.接口的作用 1.程序的解耦.(低耦合)        2.定 ...

  7. Golang 基础之基础语法梳理 (三)

    大家好,今天将梳理出的 Go语言基础语法内容,分享给大家. 请多多指教,谢谢. 本次<Go语言基础语法内容>共分为三个章节,本文为第三章节 Golang 基础之基础语法梳理 (一) Gol ...

  8. Golang 基础之基础语法梳理 (一)

    大家好,今天将梳理出的 Go语言基础语法内容,分享给大家. 请多多指教,谢谢. 本次<Go语言基础语法内容>共分为三个章节,本文为第一章节 Golang 基础之基础语法梳理 (一) Gol ...

  9. Golang基础教程

    以下使用goland的IDE演示,包含总计的golang基础功能共20个章节 一.go语言结构: 二.go基础语法: 三.变量 四.常量 五.运算符 六.条件语句 七.循环 八.函数 九.变量作用域 ...

随机推荐

  1. Mysql学习---索引的学习 180101

    索引:约束 + 快速查找 索引是数据库中用于帮助用户快速查询数据的一种数据结构.类似于字典中的目录,查找字典内容时可以根据目录查找到数据的存放位置,然后直接获取即可. 问:为什么索引可以这么快?[类似 ...

  2. 乘风破浪:LeetCode真题_014_Longest Common Prefix

    乘风破浪:LeetCode真题_014_Longest Common Prefix 一.前言 如何输出最长的共同前缀呢,在给定的字符串中,我们可以通过笨办法去遍历,直到其中某一个字符不相等了,这样就得 ...

  3. #Alpha Scrum6

    Alpha Scrum6 牛肉面不要牛肉不要面 Alpha项目冲刺(团队作业5) 各个成员在 Alpha 阶段认领的任务 林志松:督促和监督团队进度 陈彬:博客编写 吴沂章.林锃寒:代码功能完善 林志 ...

  4. javascript编译与运行机理(1)--

    随着学习js的深入就越想了解其内部的运行机理,看了很多文章,感觉下面总结的不错.但囿于个人水平,只是达到了理解层面,还不能提出自己的见解,只好把资料罗列出来,留待以后总结: 1.Javascript的 ...

  5. BZOJ 3224 Tyvj 1728 普通平衡树模板

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=3224 题目大意: 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以 ...

  6. SpringMVC 多文件上传

    springMVC.xml 配置 <bean id="multipartResolver" class="org.springframework.web.multi ...

  7. java的四舍五入

    四舍五入是我们小学的数学问题,这个问题对于我们程序猿来说就类似于1到10的加减乘除那么简单了.在讲解之间我们先看如下一个经典的案例: public static void main(String[] ...

  8. HttpURLConnection与HttpClient学习

    转载HttpURLConnection与HttpClient浅析 一.HttpURLConnection的使用 import org.slf4j.Logger; import org.slf4j.Lo ...

  9. STM8 亮灯程序

    开发环境:ST Visual Develop+STM32 ST-LINK Utility+开发板 原理:定时向指定针脚输出高电平信号 /* MAIN.C file * * Copyright (c) ...

  10. sql连接查询INNER JOIN,LEFT JOIN,RIGHT JOIN区别

    测试表 课程表cource 教师表teacher 查询老师教的课程 1.inner join内链接 ,只显示完全匹配的查询结果 SELECT  cource.cname,teacher.tname f ...