接口类型是对其他类型行为的概括与抽象,接口类型可以定义一组方法,但是这些方不是必要实现的。接口本质上也是一种类型,是指针类型,接口可以实现多态。接口本身不能创建实例,但是可以只想一个已经实现了该接口方法的自定义类型来实现。
接口赋值
分为两种情况:
1)将实现了接口的对象实例赋值给接口
2)将一个接口赋值给另一个接口,注意,只要两个接口的方法列表相同就可以互相赋值,但是接口赋值并不一定完全等价(方法完全相同),只要接口B的方法列表是接口A的方法列表的子集,那么接口A就可以赋值给接口B
示例
package main
import(
"fmt"
)
type interfaceI interface{
write()
}
type interfaceII interface{
write()
read()
}
type UDP struct{
addr string
}
func(udp UDP)write(){
fmt.Println("udp write...")
}
func(udp UDP)read(){
fmt.Println("udp read...")
}
func main(){
var udp UDP
var ifc interfaceII = udp
ifc.write()
var ifc1 interfaceI = ifc
ifc1.write()
}
输出:
udp write...
udp write...
接口查询
接口查询在程序运行时进行,查询是否成功,也要在运行期才能够确定。可以通过使用“接口类型.(type)”形式来判断接口存储的类型,接口查询常用语类型推断。
示例:
func Len(array interface{})int{
var length int
if array == nil{
length = 0
}
switch array.(type) {
case []int:
length = len(array.([]int))
case []string:
length = len(array.([]string))
case []float32:
length = len(array.([]float32))
}
return length
}
接口实现多态
多态功能一般要结合Go语言的方法实现,作为函数参数可以很容易实现多态
示例:
package main
import(
"fmt"
)
type message interface{
send()
}
type Email struct{
data string
receiver string
}
func(e *Email)send(){
fmt.Printf("send email message data:%s,receiver:%s...",e.data,e.receiver)
}
type WeChat struct{
data string
receiver string
}
func(we *WeChat)send(){
fmt.Printf("send wechat message data:%s,receiver:%s...",we.data,we.receiver)
}
func sendMessage(msg message){
msg.send()
}
func main(){
email := Email{
data:"email data",
receiver:"email receiver",
}
sendMessage(&email)
wechat := WeChat{
data:"wechat data",
receiver:"wechat receiver",
}
sendMessage(&wechat)
}
输出:
send email message data:email data,receiver:email receiver...
send wechat message data:wechat data,receiver:wechat receiver...