Golang接口使用教程详解_第1页
Golang接口使用教程详解_第2页
Golang接口使用教程详解_第3页
Golang接口使用教程详解_第4页
Golang接口使用教程详解_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论