go语言中的interface使用实例
go语言中的interface是一组未实现的方法的集合,如果某个对象实现了接口中的所有方法,那么此对象就实现了此接口。与其它面向对象语言不同的是,go中无需显示声明调用了哪个接口。
packagemain import( "fmt" ) typeIinterface{ Get()int Put(int) } typeSstruct{iint} func(p*S)Get()int {returnp.i} func(p*S)Put(vint){p.i=v} typeRstruct{iint} func(p*R)Get()int {returnp.i} func(p*R)Put(vint){p.i=v} funcf1(pI){ fmt.Println(p.Get()) p.Put(1) } //interface{}空接口,能接受任何类型。.(I)是类型断言,用于转换something到I类型的接口 funcf2(pinterface{}){ ift,ok:=p.(S);ok{ fmt.Println("S:",t) }elseift,ok:=p.(I);ok{ fmt.Println("I:",t.Get()) } } funcf3(pinterface{}){ switcht:=p.(type){ caseS: fmt.Println("S:",t.Get()) caseR: fmt.Println("R:",t.Get()) caseI: fmt.Println("I:",t.Get()) default: fmt.Println("unknowtype") } } funcmain(){ s:=S{101} f1(&s) f2(&s) r:=R{1111} f3(&r) }
如上结构S实现了I的两个方法,因此S实现了I。因为S实现了I,因此可以调用f向其传递S类型值得指针。
总结如下:
(1)使用“comma,ok”来判断一个接口类型是否实现了某个特定接口:
ift,ok:=something.(I);ok{ //对于某些实现了接口I的 //t是其所拥有的类型 }
(2)声明为interface类型的变量,可以存储任何实现了interface中所有方法的类型的变量
(3)空接口可代表任何类型,可做形参和返回类型
packagemain import"fmt" funcmain(){ //interface{} variinterface{}=100 varsinterface{}="hello" fmt.Printf("i=%d,s=%s\n",i,s) s=i fmt.Printf("i=%d,s=%d\n",i,s) }
(4)interface组合
将一个interface1嵌入到另一个interface2的声明中,其作用相当于把interface1的函数包含到interface2中,但是组合中不同有重复的方法
注:
a.只要两个接口中的方法列表相同(与顺序无关),即为相同的接口,可以相互赋值
b.interface1的方法列表属于另一个interface2的方法列表的子集,interface2可以赋值给interface1,反之不成立(因为方法缺失),interface2中的方法会覆盖interface1中同名的方法
c.可以嵌入包中的interface