判断是否实现接口

Go 里面没有implements关键字来判断一个结构体 (对象) 是否实现了某个接口,要实现类似的功能, 需要用到类型断言

类型断言

//判断v是否实现了接口i
//返回值ok为true表示已实现,ok为false表示未实现
if_,ok:=v.(i);ok{
//dosomething...
}

例子

判断是否实现接口

packagemain
import"fmt"
typegeometryinterface{
area()float64
perimeter()float64
}
typerectanglestruct{
width,heightfloat64
}
typecirclestruct{
radiusfloat64
}
func(r*rectangle)area()float64{
returnr.width*r.height
}
func(r*rectangle)perimeter()float64{
return(r.width+r.height)*2
}
funcmain(){
varrinterface{}
r=&rectangle{
width:10,
height:5,
}
ifv,ok:=r.(geometry);ok{
fmt.Printf("rimplementsinterfacegeometry,area=%.2f,perimeter=%.2f\n",v.area(),v.perimeter())
}
varcinterface{}
c=&circle{
radius:10,
}
if_,ok:=c.(geometry);!ok{
fmt.Println("cdoesnotimplementinterfacegeometry")
}
}
//$gorunmain.go
//输出如下
/**
rimplementsinterfacegeometry,area=50.00,perimeter=30.00
cdoesnotimplementinterfacegeometry
*/

实现系统错误接口

error数据类型本质上就是一个接口,原型如下:

packagebuiltin
typeerrorinterface{
Error()string
}

例子

实现 error 接口

packagemain
import(
"fmt"
)
//自定义错误结构体
typedivideErrorstruct{
msgstring
}
//实现error接口
func(d*divideError)Error()string{
returnd.msg
}
funcnewDivideError()*divideError{
return&divideError{
msg:"dividebyzero",
}
}
//自定义除法函数
funcmyDivide(dividend,divisorfloat64)(float64,error){
ifdivisor==0{//除数不能为0
return0,newDivideError()//返回一个自定义错误
}
returndividend/divisor,nil
}
funcmain(){
divide,err:=myDivide(100,0)
iferr!=nil{
fmt.Printf("Error:%s\n",err)//输出错误信息
}else{
fmt.Printf("100/0=%.2f\n",divide)//代码执行不到这里
}
}
//$gorunmain.go
//输出如下
/**
Error:dividebyzero
*/

联系我

Go 快速入门指南 - 判断是否实现接口

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。