go 的接口类型用于定义一组行为,其中每个行为都由一个方法声明表示。

接口类型中的方法声明只有方法签名而没有方法实体,而方法签名包括且仅包括方法的名称、参数列表和结果列表。

只要一种数据类型的方法集合中包含了Talk接口声明中的所有方法,那么它就一定是Talk接口的实现类型。

  1. type Talk interface{
  2. Hello(username stirng)string
  3. Talk(heard string)(saying string ,end bool, err error)
  4. }
  5.  
  6. type myTalk string
  7. func (talk myTalk)Hello(username stirng)string{
  8. //省略部分代码
  9. }
  10.  
  11. func (talk myTalk)Talk(heard string)(saying string ,end bool, err error){
  12. //省略部分代码
  13. }

上面示例中,与myTalk关联的所有方法都是指针方法,这意味着,myTalk类型并不是Talk接口的实现类型,*myTalk类型才是。

一个接口类型的变量可以被赋予任何实现类型的值

eg:

  1. var talk Talk = new(myTalk)

 内建函数new的功能是创建一个指定类型的值,并返回指向该值的指针。

若想确定变量talk中值是否属于“myTalk” 类型,则可以用类型断言来判断:

  1. _,ok :=talk.(*myTalk)

  

go的数据类型之间并不存在继承关系,接口类型也是如此,不过,一个接口型的声明中可以嵌套任意其他接口类型。

  1. type Chatbot interfaxce{
  2. Name()string
  3. Regin()(string,error)
  4. Talk
  5. ReportError(err errors)string
  6. End() error
  7. }

  moke/moke.go

  1. package moke
  2.  
  3. //interface definition
  4. type VowelsFinder interface {
  5. FindVowels() []rune
  6. }
  7.  
  8. type MyString string
  9.  
  10. //MyString implements VowelsFinder
  11. func (ms MyString) FindVowels() []rune {
  12. var vowels []rune
  13. for _, rune := range ms {
  14. if rune == 'a' || rune == 'e' || rune == 'i' || rune == 'o' || rune == 'u' {
  15. vowels = append(vowels, rune)
  16. }
  17. }
  18. return vowels
  19. }

  main.go

  1. package main
  2.  
  3. import (
  4. "fmt"
  5. "studycode/moke"
  6. )
  7.  
  8. func main() {
  9. name := moke.MyString("Sam Anderson")
  10. var v moke.VowelsFinder
  11. v = name // possible since MyString implements VowelsFinder
  12. fmt.Printf("Vowels are %c", v.FindVowels())
  13.  
  14. }

  

执行结果

示例二:

man/man.go

  1. package man
  2.  
  3. import (
  4. "fmt"
  5. )
  6.  
  7. type People interface {
  8. GetAge() int
  9. GetName() string
  10. }
  11.  
  12. type Man struct {
  13. }
  14.  
  15. func (a *Man) GetAge() int {
  16. return 18
  17. }
  18.  
  19. func (a *Man) GetName() string {
  20. return "mike"
  21. }
  22.  
  23. func TestPeople(p interface{}) {
  24. switch p.(type) { //变量.(type)只能在switch中使用
  25. case People:
  26. fmt.Println("realize People interface")
  27. default:
  28. fmt.Println("realize People2 interface")
  29. }
  30.  
  31. }

  main.go

  1. package main
  2.  
  3. import (
  4. "studycode/man"
  5. )
  6.  
  7. func main() {
  8. man1 := man.Man{}
  9. man.TestPeople(&man1)
  10.  
  11. }

  执行结果

golang学习笔记--接口的更多相关文章

  1. golang学习笔记20 一道考察对并发多协程操作一个共享变量的面试题

    golang学习笔记20 一道考察对并发多协程操作一个共享变量的面试题 下面这个程序运行的能num结果是什么? package main import ( "fmt" " ...

  2. golang学习笔记19 用Golang实现以太坊代币转账

    golang学习笔记19 用Golang实现以太坊代币转账 在以太坊区块链中,我们称代币为Token,是以太坊区块链中每个人都可以任意发行的数字资产.并且它必须是遵循erc20标准的,至于erc20标 ...

  3. golang学习笔记18 用go语言编写移动端sdk和app开发gomobile

    golang学习笔记18 用go语言编写移动端sdk和app开发gomobile gomobile的使用-用go语言编写移动端sdk和app开发https://blog.csdn.net/u01249 ...

  4. golang学习笔记17 爬虫技术路线图,python,java,nodejs,go语言,scrapy主流框架介绍

    golang学习笔记17 爬虫技术路线图,python,java,nodejs,go语言,scrapy主流框架介绍 go语言爬虫框架:gocolly/colly,goquery,colly,chrom ...

  5. golang学习笔记16 beego orm 数据库操作

    golang学习笔记16 beego orm 数据库操作 beego ORM 是一个强大的 Go 语言 ORM 框架.她的灵感主要来自 Django ORM 和 SQLAlchemy. 目前该框架仍处 ...

  6. golang学习笔记14 golang substring 截取字符串

    golang学习笔记14 golang substring 截取字符串golang 没有java那样的substring函数,但支持直接根据 index 截取字符串mystr := "hel ...

  7. golang学习笔记13 Golang 类型转换整理 go语言string、int、int64、float64、complex 互相转换

    golang学习笔记13 Golang 类型转换整理 go语言string.int.int64.float64.complex 互相转换 #string到intint,err:=strconv.Ato ...

  8. golang学习笔记12 beego table name `xxx` repeat register, must be unique 错误问题

    golang学习笔记12 beego table name `xxx` repeat register, must be unique 错误问题 今天测试了重新建一个项目生成新的表,然后复制到旧的项目 ...

  9. golang学习笔记11 golang要用jetbrain的golang这个IDE工具开发才好

    golang学习笔记11   golang要用jetbrain的golang这个IDE工具开发才好  jetbrain家的全套ide都很好用,一定要dark背景风格才装B   从File-->s ...

随机推荐

  1. 高性能TcpServer(Python) - SocketServer

    源码下载  -> 提取码  QQ:505645074 程序结构图  测试截图 1. 正常接收测试 2. 并发测试

  2. 触发器TRIGGER 自增IDENTITY 聚集索引CLUSTERED

    在触发器的“触发”过程中,有两个临时表inserted和deleted发生了作用.这两个特殊的临时表inserted和deleted,仅仅在触发器运行时存在,它们在某一特定时间和某一特定表相关. CR ...

  3. 【Spring AOP】Spring AOP之你必须知道的AOP相关概念(1)

    一.什么是AOP AOP(Aspect-oriented Programming)即面向切面编程,是对OOP( Object-oriented Programming)即面向对象编程的一种补充,AOP ...

  4. 开放API接口安全处理!

    目录 概念 加密 MD5 Token 开放api参数 重复提交,恶意调用 日志 验证码 开放API接口安全处理! 参考文献: 公钥,私钥和数字签名这样最好理解 (转载) 概念 存在问题: 数据窃取 数 ...

  5. Qemu-4.1 桥接网络设置

    参考: [qemu] qemu旧的net参数已经不再可用了,新的这样用. QEMU's new -nic command line option 用Qemu模拟vexpress-a9 --- 配置 q ...

  6. openCV CV2用法(转)

    文章转自:https://www.kancloud.cn/aollo/aolloopencv/262768 一.读入图像 使用函数cv2.imread(filepath,flags)读入一副图片 fi ...

  7. java接口顺口溜

    原创作品,转载请注明来源,这篇博客我也发到了我的csdnhttps://blog.csdn.net/suyues/article/details/103458086 接口 接口定义全局变量和抽象方法 ...

  8. Codeforces D. The Sum of the k-th Powers(拉格朗日插值)

    题目描述: The Sum of the k-th Powers time limit per test 2 seconds memory limit per test 256 megabytes i ...

  9. Python使用进程间共享变量来控制两个进程(监听键盘和相机录制)的交互

    我有个简单的应用需求: 1. 该应用随时会监听键盘的输入: 2. 当输入指定键时会控制相机录制的启动和关闭. 监听键盘是一个事件循环,相机录制也是一个循环录制的过程.我试着用 Python 启动两个进 ...

  10. django rest framework 认证组件

    1.认证组件 1.认证组件 1.认证组件 1.认证组件