如何判断接口调用哪个类(Go 快速入门指南 – 判断是否实现接口)
导读:判断是否实现接口...
判断是否实现接口
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 */联系我
创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!