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