版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第Golang接口使用教程详解通过在结构体中嵌入一个接口类型,从而让该结构体类型实现了该接口类型,并且还可以改写该接口的方法。
//Less为reverse类型添加Less方法,重写原Interface接口类型的Less方法
func(rreverse)Less(i,jint)bool{
returnr.Interface.Less(j,i)
Interface类型原本的Less方法签名为Less(i,jint)bool,此处重写为r.Interface.Less(j,i),即通过将索引参数交换位置实现反转。
在这个示例中还有一个需要注意的地方是reverse结构体本身是不可导出的(结构体类型名称首字母小写),sort.go中通过定义一个可导出的Reverse函数来让使用者创建reverse结构体实例。
funcReverse(dataInterface)Interface{
returnreverse{data}
这样做的目的是保证得到的reverse结构体中的Interface属性一定不为nil,否者r.Interface.Less(j,i)就会出现空指针panic。
六、空接口
Golang中的接口可以不定义任何方法,没有定义任何方法的接口就是空接口。空接口表示没有任何约束,因此任何类型变量都可以实现空接口。
空接口在实际项目中用的是非常多的,用空接口可以表示任意数据类型。
示例
funcmain(){
//定义一个空接口x,x变量可以接收任意的数据类型
varxinterface{}
str:="HelloGo"
x=str
fmt.Printf("type:%T,value:%v\n",x,x)
num:=10
x=num
fmt.Printf("type:%T,value:%v\n",x,x)
bool:=true
x=bool
fmt.Printf("type:%T,value:%v\n",x,x)
运行结果
type:string,value:HelloGo
type:int,value:10
type:bool,value:true
1、空接口作为函数的参数
//空接口作为函数参数
funcshow(ainterface{}){
fmt.Printf("type:%Tvalue:%v\n",a,a)
funcmain(){
show(1)
show(true)
show(3.14)
varmapStr=make(map[string]string)
mapStr["name"]="Leefs"
mapStr["age"]="12"
show(mapStr)
运行结果
type:intvalue:1
type:boolvalue:true
type:float64value:3.14
type:map[string]stringvalue:map[age:12name:Leefs]
2、map的值实现空接口
funcmain(){
//空接口作为map值
varstudentInfo=make(map[string]interface{})
studentInfo["name"]="Jeyoo"
studentInfo["age"]=18
studentInfo["married"]=false
fmt.Println(studentInfo)
运行结果
map[age:18married:falsename:Jeyoo]
3、切片实现空接口
funcmain(){
varslice=[]interface{}{"Jeyoo",20,true,32.2}
fmt.Println(slice)
运行结果
[Jeyoo20true32.2]
七、类型断言
一个接口的值(简称接口值)是由一个具体类型和具体类型的值两部分组成的。这两部分分别称为接口的动态类型和动态值。
如果我们想要判断空接口中值的类型,那么这个时候就可以使用类型断言,其语法格式:
x.(T)
说明
x:表示类型为interface{}的变量T:表示断言x可能是的类型
该语法返回两个参数,第一个参数是x转化为T类型后的变量,第二个值是一个布尔值,若为true则表示断言成功,为false则表示断言失败。
示例
funcmain(){
varxinterface{}
x="HelloGO"
v,ok:=x.(string)
ifok{
fmt.Println(v)
}else{
fmt.Println("类型断言失败")
上面的示例中如果要断言多次就需要写多个if判断,这个时候我们可以使用switch语句来实现:
注意:类型.(type)只能结合switch语句使用
//justifyType对传入的空接口类型变量x进行类型断言
funcjustifyType(xinterface{}){
switchv:=x.(type){
casestring:
fmt.Printf("xisastring,valueis%v\n",v)
caseint:
fmt.Printf("xisaintis%v\n",v)
casebool:
fmt.Printf("xisaboolis%v\n",v)
default:
fmt.Println("unsupporttype!")
由于接口类型变量能够动态存储不同类型值的特点,所以很多初学者会滥用接口类型(特别是空接口)来实现编码过程中的便捷。
只有当有两个或两个以上的具体类型必须以相同的方式进行处理时才需要定义接口。切记不要为了使用接口类型而增加不必要的抽象,导致不必要的运行时损耗。
总结
在Go语言中接口是一个非常重要的概念和特性,使用接口类型能够实现代码的抽象和解耦,也可以隐藏某个功能的内部实现,但是缺点就是在查看源码的时候,不太方便查找到具体实现接口的类型。
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024-2025学年全国统考教师资格考试《教育教学知识与能力(小学)》练习题审定版附答案详解
- 2024-2025学年度宝鸡职业技术学院单招《语文》综合提升测试卷附参考答案详解【综合题】
- 2024-2025学年农村信用社招聘考试题库试题(精练)附答案详解
- 2024-2025学年度执业兽医测试卷及参考答案详解(综合卷)
- 2024-2025学年度施工员模拟题库含答案详解AB卷
- 2024-2025学年度监理工程师全真模拟模拟题及完整答案详解【名校卷】
- 2024-2025学年度天津城市建设管理职业技术学院单招数学练习题及参考答案详解【研优卷】
- 2024-2025学年度计算机四级考前冲刺练习题及参考答案详解(研优卷)
- 2024-2025学年度广东环境保护工程职业学院妇产护理期末模拟试题带答案详解(突破训练)
- 企业资产完备无损承诺书(6篇)
- 汽轮机组试车方案
- 漆安慎力学第二版课后习题解答及漆安慎-力学答案
- PCI围术期强化他汀治疗的获益和机制课件
- 沥青搅拌站安全生产风险分级管控体系方案资料(2022-2023版)
- WTO海关估价协议中文版
- 【广东省】工作证明模板(仅供参考)
- YS/T 613-2006碳膜电位器用电阻浆料
- GB/T 33365-2016钢筋混凝土用钢筋焊接网试验方法
- GB/T 17626.10-2017电磁兼容试验和测量技术阻尼振荡磁场抗扰度试验
- GB/T 14536.6-2008家用和类似用途电自动控制器燃烧器电自动控制系统的特殊要求
- 《乡风文明建设》(王博文)
评论
0/150
提交评论