判断是否实现接口
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÷Error{
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
*/