interface简介

interface(接口)是golang最重要的特性之一,Interface类型可以定义一组方法,但是这些不需要实现。并且interface不能包含任何变量。

简单的说:

  • interface是方法的集合
  • interface是一种类型,并且是指针类型
  • interface的更重要的作用在于多态实现

interface定义

type  接口名称 interface {
method1 (参数列表) 返回值列表
method2 (参数列表) 返回值列表
...
}

interface使用

  • 接口的使用不仅仅针对结构体,自定义类型、变量等等都可以实现接口。
  • 如果一个接口没有任何方法,我们称为空接口,由于空接口没有方法,所以任何类型都实现了空接口。
  • 要实现一个接口,必须实现该接口里面的所有方法。
package mainimport "fmt"//定义接口
type Skills interface {Running()Getname() string}type Student struct {Name stringAge int
}// 实现接口
func (p Student) Getname() string{   //实现Getname方法fmt.Println(p.Name )return p.Name
}func (p Student) Running()  {   // 实现 Running方法fmt.Printf("%s running",p.Name)
}
func main()  {var skill Skillsvar stu1 Studentstu1.Name = "wd"stu1.Age = 22skill = stu1skill.Running()  //调用接口
}//wd running

多态

上面提到了,go语言中interface是实现多态的一种形式,所谓多态,就是一种事物的多种形态,与python中类的多态是一致的。

同一个interface,不同的类型实现,都可以进行调用,它们都按照统一接口进行操作。

在上面的示例中,我们增加一个Teacher结构体,同样实现接口进行说明:

package mainimport "fmt"type Skills interface {Running()Getname() string}type Student struct {Name stringAge int
}type Teacher struct {Name stringSalary int
}func (p Student) Getname() string{   //实现Getname方法fmt.Println(p.Name )return p.Name
}func (p Student) Running()  {   // 实现 Running方法fmt.Printf("%s running",p.Name)
}func (p Teacher) Getname() string{   //实现Getname方法fmt.Println(p.Name )return p.Name
}func (p Teacher) Running()  {   // 实现 Running方法fmt.Printf("\n%s running",p.Name)
}
func main()  {var skill Skillsvar stu1 Studentvar t1 Teachert1.Name = "wang"stu1.Name = "wd"stu1.Age = 22skill = stu1skill.Running()skill = t1t1.Running()
}
//wd running
//wang running

接口嵌套

go语言中的接口可以嵌套,可以理解我继承,子接口拥有父接口的所有方法,并且想要使用该子接口的话,必须将父接口和子接口的所有方法都实现。

type Skills interface {Running()Getname() string}type Test interface {sleeping()Skills   //继承Skills
}

类型转换

由于接口是一般类型,当我们使用接口时候可能不知道它是那个类型实现的,基本数据类型我们有对应的方法进行类型转换,当然接口类型也有类型转换。

当然我们也可以用这个方式来进行类型的判断。

转换方式:

var s int
var x interfacex = s
y , ok := x.(int)  //将interface 转为int,ok可省略 但是省略以后转换失败会报错,true转换成功,false转换失败, 并采用默认值
package mainimport "fmt"func main()  {var x interface{}s := "WD"x = sy,ok := x.(int)z,ok1 := x.(string)fmt.Println(y,ok)fmt.Println(z,ok1)
}
//0 false
//WD true

判断类型示例:

package mainimport "fmt"type Student struct {Name string
}func TestType(items ...interface{}) {for k, v := range items {switch v.(type) {case string:fmt.Printf("type is string, %d[%v]\n", k, v)case bool:fmt.Printf("type is bool, %d[%v]\n", k, v)case int:fmt.Printf("type is int, %d[%v]\n", k, v)case float32, float64:fmt.Printf("type is float, %d[%v]\n", k, v)case Student:fmt.Printf("type is Student, %d[%v]\n", k, v)case *Student:fmt.Printf("type is Student, %d[%p]\n", k, v)}
}
}func main() {var stu Student
TestType("WD", 100, stu,3.3)
}
//type is string, 0[WD]
//type is int, 1[100]
//type is Student, 2[{}]
//type is float, 3[3.3]

go语言interface用法相关推荐

  1. c语言指针用法有哪些

    c语言指针用法: 一,指针定义: 指针变量的取值范围取值0~4G,是一种数据类型(无符号整数,代表了内存编号).它可以用来定义变量(与int.long一样),与int.long不同的它存储整数代表了内 ...

  2. C语言STATIC用法

    C语言STATIC用法 转自:http://blog.csdn.net/vagrantisme/article/details/4083722       1. static 变量 静态变量的类型 说 ...

  3. go 正则表达式分组匹配_Go语言正则表达式用法实例小结【查找、匹配、替换等】...

    本文实例讲述了Go语言正则表达式用法.分享给大家供大家参考,具体如下: Go语言的正则表达式使用很简单,示例代码: 复制代码 代码如下: package test import ( "fmt ...

  4. golang语言 []interface{}和interface{}

    文章目录 golang语言 []interface{} interface(接口) interface应用场景 interface{} 空接口 []interface{} golang中为什么[]st ...

  5. R语言 sub()用法

    R语言 sub()用法 subR语言中的函数用于替换字符串中模式的第一个匹配项.如果有一个字符串元素向量,那么它将替换所有元素中模式的第一个匹配项. 用法: sub(pattern, replacem ...

  6. C语言continue用法

    C语言continue用法 continue只是跳出当前循环,并不会跳出整个while循环. For example: 建立 showchar2.c 1 #include <stdio.h> ...

  7. c语言sleep作用,c语言sleep用法是什么?

    小编以前Sleep(1000)等于一秒,现在sleep(1)等于一秒,,,什么情况恭喜你找到共度一生的灵魂伴侣,婚姻是人生大事,小编也相信你做出的会是最明智的决定,到时有了爱的结晶生了可爱的宝宝,别忘 ...

  8. c语言指针用法及实际应用详解,通俗易懂超详细

    c语言指针用法及实际应用详解,通俗易懂超详细! \\\插播一条:文章末尾有惊喜哟~/// 今天给大家来讲解一下指针. 我会由浅到深,最后联合实际应用讲解,让大家学会指针的同时,知道大佬们都用指针来干嘛 ...

  9. c语言strcpy()用法

    c语言strcpy()用法 strcpy,即string copy(字符串复制)的缩写. strcpy是一种C语言的标准库函数,strcpy把从src地址开始且含有'\0'结束符的字符串复制到以des ...

  10. C语言offsetof用法以及其扩展用法

    标题C语言offsetof用法以及其扩展用法 offsetof由于不是标准库的函数,所以得查一下,在stddef.h中,搜索一下编译器的这个头文件位置: 暴力一点,直接在根目录下搜索,find -na ...

最新文章

  1. 数据结构与算法(6-4)线索二叉树
  2. 程序员敲诈老板,或面临 37 年监禁
  3. 分析周鸿祎的安全卫士360[转]
  4. LabelImg 批量生成标注图片文件夹序号(起始值+终值)
  5. 指针04 - 零基础入门学习C语言44
  6. 艾伟:基于.NET平台的Windows编程实战(四)—— 数据库操作类的编写
  7. PHP超级全局变量总结
  8. [TypeScript] Interface and Class
  9. 【刷题】BZOJ 3926 [Zjoi2015]诸神眷顾的幻想乡
  10. 将dataset中的数据 数据库中 java_java-将NoSQLUnit与@ShouldMatchDataSet一起使用时,...
  11. Android--最全的启动第三方APP,应用程序(按需启动,历史启动)
  12. Linux安装DBLE
  13. 最难忘的一节计算机课,最难忘的一节课作文(3篇)
  14. golang:模拟http post请求
  15. mtk6737t摄像头配置文件的编译
  16. 一个屌丝程序猿的人生(八十三)
  17. 物理世界的鲁棒语音对抗样本(源码阅读笔记)下
  18. 纽约州立大学水牛城分校计算机科学专业,美国布法罗大学(纽约州立大学水牛城分校)介绍/专业/申请条件/奖学金 | Hotcourses中国...
  19. 网络工程师与网络管理员的区别和前景
  20. AHP层次分析法java实现

热门文章

  1. Not showing null elements
  2. 一副眼镜一千多贵吗_央视曝光!一副眼镜上千元,出厂价却只要几十元
  3. python langid 语种检测以及语种对应表
  4. 12-Solidity8.0-view和pure区别
  5. db2数据库常见问题处理
  6. 局域网ip扫描工具_一款针对Profinet协议漏洞渗透的工具
  7. 加拿大教授 武 计算机,加拿大卡尔加里大学Yingxu Wang教授访问计算机学院
  8. 120日均线金叉250日均线是大牛市来临的重要信号
  9. 搭建以太坊私有链多节点环境
  10. 高效能人士的七个习惯--读书笔记