十个示例带你深入了解Go语言中的接口
1.空接口既然可以存储任意类型的值,那么从空接口获取到的值是否可以直接使用?看下面栗子
packagemain import( "fmt" ) varainterface{} varbinterface{} funcmain(){ a=1024 b=100 res:=a+b fmt.Println(res) }
报错:
invalid operation: operato开发者_自学开发r + not defined on a (variab编程客栈le of type interface{}) (exit status 2)
程序报错的原因:因为空接口的类型是不可以直接使用的,需要警告类型断言转换方可使用。
2.这次我们使用类型断言来将接口类型转成int类型
packagemain import( "fmt" ) varainterface{} varbinterface{} funcmain(){ a=1024 b=100 val1,res1:=a.(int) fmt.Println(val1,res1) val2,res2:=androidb.(int) fmt.Println(val2,res2) //val1和val2接收转换后的值,res1和res2是类型断言的状态(成功或失败),断言成功是true,反之false }
输出:
1024 true
100 true
3.类型断言新姿势:当使用一个值接受断言结果时,则会直接返回断言后的值
packagemain import( "fmt" ) varainterface{} varbinterface{} funcmain(){ a=1024 b=100 //类型断言转换 a1:=a.(int) b1:=b.(int) //转换后进行相加,就不会报错了 res:=a1+b1 fmt.Println(res) }
4.体会一下使用类型断言转换失败的快感
packagemain import( "fmt" "log" ) varainterface{} funcmain(){ a=1024 ifa1,r:=a.(string);r{ fmt.Println(a1) }else{ log.Fatalln("类型断言转换失败") } }
输出:
2022/10/25 10:30:48 类型断言转换失败
变量a存储值是整型,视图使用类型断言将其转换为字符串,结果报错了,这么玩是不行的,玩不起。
5.类型断言+switch实现数据类型判断
packagemain import( "fmt" ) funcTestFunc(valueinterface{}){ switchvalue.(type){ caseint: fmt.Printf("value=%vTypeInt\n",value) casefloat32: fmt.Printf("value=%vTypeFloat32\n",value) casefloat64: fmt.Printf("value=%vTypeFloat64\n",value) casestring: fmt.Printf("value=%vTypestring\n",value) } } funcmain(){ TestFunc("hello") TestFunc(100) TestFunc(89.12) }
输出:
value=hello Type string
value=100 Type Intvalue=89.12 Type Float64
6.还可以将接口类型转换成另一个接口类型,下面的栗子是将A接口转换成B接口
packagemain import( "fmt" ) typeAinterface{} typeBinterface{} funcmain(){ varaA=100 b:=a.(B) fmt.Println(b) }
在之前的栗子,都是将接口类型转换成基本的数据类型,而这个栗子是将一个自定义的接口类型转换成另一个自定义的接口类型。
7.还可以将接口类型转成指针类型,看下面的栗子
packagemain import"fmt" funcmain(){ //定义接口类型的变量ainter varainterinterface{} num:=100 ainter=&num//将地址赋给接口变量 v,r:=ainter.(*int) fmt.Println(v,r) }
上面的栗子中,使用类型断言将接口类型转成了int指针类型
8.接口可以嵌套吗?实战告诉你
packagemain import"fmt" typeaction1interface{ insert() } typeaction2interface{ delete() } typeactionInterfaceinterface{ action1 action2 query() } typeDbstruct{ Datastring } func(dDb)insert(){ fmt.Print("插入数据...",d.Data) } func(dDb)delete(){ fmt.Print("删除数据...",d.Data) } func(dDb)query(){ fmt.Print("查询数据...",d.Data) } funcmain(){ d:=Db{Data:"hello"} d.query() d.delete() d.insert() }
通过上面的实战,接口是可以嵌套的,注意了,只有实现接口中所有的方法(含所有嵌套接口里的http://www.devze.com所有方法),那么才算是真正实现了接口。
9.实现error接口中的Error方编程客栈法,来玩一个自定义错误类型的栗子
packagemain import( "fmt" ) typeAddErrorstruct{ ErrorMsgstring } func(mAddError)Error()string{ returnfmt.Sprintf("Adderror%v",m.ErrorM编程客栈sg) } funcadd(aint,bint)(int,error){ ifa==0||b==0{ errinfo:=fmt.Sprintf("a=%v,b=%v",a,b) return0,AddError{ErrorMsg:errinfo} }else{ returna+b,nil } } funcmain(){ res,err:=add(8,0) fmt.Println(res,err) }
上面的栗子中,已经隐式的实现了error接口中的Error方法
10.如果不玩自定义的错误类型,也可以直接使用errors.New方法返回一个错误信息
packagemain import( "errors" "fmt" ) funcadd(aint,bint)(int,error){ ifa==0||b==0{ return0,errors.New("不能为0") }else{ returna+b,nil } } funcmain(){ res,err:=add(9,1) fmt.Println(res,err) }
到此这篇关于十个示例带你深入了解Go语言中的接口的文章就介绍到这了,更多相关Go语言 接口内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!
精彩评论