示例代码
package mainimport "fmt"type Computer interface {CalculatorPlay(string) string
}type Calculator interface {Open(string) CalculatorSay(string) stringAdd(uint, uint)Sum(int, int) int
}type TOM struct {Name stringAge  intBob  *BOBn    int
}type BOB struct {TOMMyName string
}func (t *TOM) Open(s string) Calculator {if s == "" {return t}return t.Bob
}func Test(c Calculator) {}func (t *TOM) Say(string) string {return "I am " + t.Name
}func (t *TOM) Add(a, b uint) {fmt.Println(a + b)
}func (t *TOM) Sum(a, b int) int {return a + b
}func (t *TOM) Play(s string) string {return s
}func (b *BOB) Say(string) string {return "My Name is " + b.MyName
}func main() {b := new(BOB)b.MyName = "Bob"t := new(TOM)t.Name = "Tom"t.Age = 12fmt.Println(t.Say(""))Test(b)Test(t)
}

上面的例子中,定义了两个接口CalculatorComputer,两个结构体TOMBOBTOM实现了接口Calculator,而BOB里面嵌套了TOM,所以也实现了接口Calculator,而接口Computer里面嵌套了Calculator,所以Computer也实现了Calculator
在Go语言中接口(interface)常常被用来当做某个函数的参数传递,也有时候,接口被用来当做返回值类型,

参数传递

比如上面的例子

func Test(c Calculator) {}
Open(string) Calculator
func (t *TOM) Open(s string) Calculator {if s == "" {return t}return t.Bob
}

函数Test(c Calculator)的参数类型是接口Calculator,这是什么意思呢,函数TEST()该如何调用呢,意思就是,当一个函数或方法的参数类型是一个接口时,哪个struct()实现了该接口,那么这个结构体对象,就可以被当做参数传递。
结构体TOMBOB都实现了接口Calculator,所以他们的对象可以被当做参数被传递到Test()里面,

b := new(BOB)
b.MyName = "Bob"
t := new(TOM)
t.Name = "Tom"
t.Age = 12
fmt.Println(t.Say(""))
Test(b)
Test(t)

返回值类型

上面有一个方法Open(),它的返回值是一个接口Calculator,这个意思就是只要哪个struct实现了接口Calculator,那么该结构体对象就可以被当做参数返回

func (t *TOM) Open(s string) Calculator {if s == "" {return t}return t.Bob
}

TOMBOB都实现了接口Calculator,所以他们都可以被作为Open()的返回值返回。

struct(结构体)嵌套

在使用结构体嵌套时要注意,当结构体BOB里面嵌套了TOM的时候,结构体TOM里面还可以将BOB作为某个变量的字段类型,但是TOM里面不可以再嵌套BOB,否则就存在循环递归调用,也就是出现了死循环。

Go语言interface(接口)的作用相关推荐

  1. Go语言-Go interface 接口的最佳实践

    文章目录 Go语言-Go 接口的最佳实践 什么是Golang中的interface 编写接口的最佳实践 1. 保持interfaces足够小 2. Interfaces Should Have No ...

  2. C#中理解接口以及接口的作用

    在C#的开发中,接口是非常重要也非常好用的.可是很多时候很多人都不是很了解接口的做用,以及该如何使用.下面我们就来理解接口的作用,并看看如何使用吧. 假设我们公司有两种程序员:VB程序员,指的是用VB ...

  3. Java接口的作用和意义是什么?

    接口的定义 接口泛指实体把自己提供给外界的一种抽象化物(可以为另一实体),用以由内部操作分离出外部沟通方法,使其能被内部修改而不影响外界其他实体与其交互的方式. 人类与电脑等信息机器或人类与程序之间的 ...

  4. Go 分布式学习利器(10)-- Go语言的接口

    文章目录 1. 接口与依赖 2. 自定义类型 1. 接口与依赖 在上一节中我们讨论Go语言的面向对象特性的时候也说了,Go语言并不支持继承,能够进行对象的封装(包括数据成员和成员函数的封装),那么这里 ...

  5. 【Go语言】【14】GO语言的接口类型

    1.什么是接口? 在面向对象的语言中,接口是用来限制实现类行为的.怎么理解这句话呢? 定义一个Person接口,我只会站在我的角度上考虑问题,比如Person(人),自然想到会吃饭.睡觉等: inte ...

  6. interface接口_golang 基础(Four) 接口进阶

    参考 Understanding Go Interface 感谢 francesc 分享 接口 我们编程中少不了对接口使用和设计,无论你是使用哪种语言或多或少都会使用到**接口**.即使你说明重来没有 ...

  7. java的知识点13——多态、对象的转型(casting)、final关键字、抽象方法和抽象类、接口的作用、如何定义和使用接口?、接口的多继承、面向接口编程

    多态 多态指的是同一个方法调用,由于对象不同可能会有不同的行为.现实生活中,同一个方法,具体实现会完全不同. 多态的要点: 1. 多态是方法的多态,不是属性的多态(多态与属性无关). 2. 多态的存在 ...

  8. java 接口的作用和好处

    1.java 接口的作用 http://blog.csdn.net/hack_bug/article/details/7634737 2.一位Java大牛的回答 很多JAVA初级程序员对于接口存在的意 ...

  9. interface接口实例

    C++标准中是没有接口interface的,但是我们在MFC的程序中经常可以看到接口的影子,我就自己查阅的资料和理解,做一个总结把. 首先,在objBase.h里面,有interface的定义 #de ...

最新文章

  1. php多表存储,php – MySql在一个单元格中存储另一个表的多个引用并选择它?
  2. Java项目:网上电商项目(前后端分离+java+vue+Springboot+ssm+mysql+maven+redis)
  3. Openstack 中的消息总线 AMQP
  4. 开发日记-20190509
  5. android中获取版本号,如何获取Android应用程序的构建/版本号?
  6. heroku能用mysql吗_heroku连接到mysql数据库
  7. 一张A4纸的牛B变化(你能吗?)
  8. php str_replace多个参数,php str_replace()函数的用法,有那些参数?
  9. Python学习笔记之头部文件
  10. RHCE 学习笔记(5)- 本地用户和组的管理
  11. android桌面快捷网页,Android向桌面添加快捷方式,使其指向特定的网页
  12. 阿里播放器的使用Aliplayer
  13. docker 安装 mysql ,redis ,nginx,tomcat,rabbitmq,fastdfs,kafka,mongo,elasticsearch
  14. 理性分析:那些吃蝙蝠的人,根本动机是什么?
  15. webservice axis2+spring整合
  16. office2010打开excel文档时为空白的解决方法
  17. 《Microduino实战》——3.4 重新认识软件与硬件
  18. oracle当天八点,oracle实现动态查询前一天早八点到当天早八点的数据功能示例
  19. docker 容器设置自动重启
  20. G2553与F5529串口

热门文章

  1. 成功八大资源:请在35岁前搞掂
  2. sql优化 EXPLAN 各参数解析
  3. 东北四省赛H-Skyscraper-线段树的区间合并优化
  4. 快速实现地图迁移数据可视化
  5. 使用xilinx7系列FPGA对比特流进行加密认证时如何确保密钥已经正确加载到FPGA中
  6. 【程序设计与实践】实验三:自动售货机
  7. 面经整理——(百度美团鹅厂网易等)
  8. 毕业后想当程序员,到底要不要考研?
  9. python实现原神卡池锁定功能
  10. Leetcode--Java--820. 单词的压缩编码