golang基础之Interface接口的使用
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
golang基础之Interface接⼝的使⽤
接⼝是⼀个或多个⽅法签名名的集合,定义⽅式如下
type Interface_Name interface { method_a() string method_b() int .... }
只要某个类型拥有该接⼝的所有⽅法签名,就算实现该接⼝,⽆需显⽰声明实现了那个接⼝,这称为structural Typing package main
import "fmt"
type USB interface { //定义⼀个接⼝:⽅法的集合
Name() string //Name⽅法,返回string
Connect() //Connect⽅法
}
type PhoneConnecter struct { //定义⼀个结构
name string //结构包含⼀个字段
}
func (pc PhoneConnecter) Name() string { //为结构定义⼀个⽅法,绑定接⼝
return //该⽅法命名为接⼝内的字段
} //返回结构体字段
func (pc PhoneConnecter) Connect() { //定义结构体另⼀个⽅法,与接⼝另⼀个⽅法绑定
fmt.Println("Connect:", )
}
func main() {
var a USB //定义⼀个变量为USB接⼝类型
a = PhoneConnecter{"PhoneConnecter"} //实例化⼀个结构体,并赋值给变量(接⼝)USB
a.Connect() //接⼝调⽤其Connect⽅法,也是结构⽅法
}
/*输出
Connect: PhoneConnecter
*/
接⼝可以作为匿名嵌⼊其它接⼝,或嵌⼊到结构中
package main
import "fmt"
type USB interface { //定义⼀个接⼝:⽅法的集合
Name() string //Name⽅法,返回string
Connecter //嵌⼊Connecter接⼝,可以使⽤Connecter⽅法
}
type Connecter interface { //定义另⼀个接⼝ Connecter
Connect() //包含⼀个接⼝⽅法:Connect
}
type PhoneConnecter struct { //定义⼀个结构
name string //结构包含⼀个字段
}
func (pc PhoneConnecter) Name() string { //为结构定义⼀个⽅法,绑定接⼝
return //该⽅法命名为接⼝内的字段
} //返回结构体字段
func (pc PhoneConnecter) Connect() { //定义结构体另⼀个⽅法,与接⼝另⼀个⽅法绑定
fmt.Println("Connect:", )
}
func main() {
var a USB //定义⼀个变量为USB接⼝类型
a = PhoneConnecter{"PhoneConnecter"} //实例化⼀个结构体,并赋值给变量(接⼝)USB
a.Connect()
Disconnect(a) //接⼝调⽤其Connect⽅法,也是结构⽅法
}
接⼝只是⽅法声明,没有实现调⽤,没有字段,只能通过绑定的类型⽅法访问
package main
import "fmt"
type USB interface { //定义⼀个接⼝:⽅法的集合
Name() string //Name⽅法,返回string
Connecter //嵌⼊Connecter接⼝,可以使⽤Connecter⽅法
}
type Connecter interface { //定义另⼀个接⼝ Connecter
Connect() //包含⼀个接⼝⽅法:Connect
}
type PhoneConnecter struct { //定义⼀个结构
name string //结构包含⼀个字段
}
func (pc PhoneConnecter) Name() string { //为结构定义⼀个⽅法,绑定接⼝
return //该⽅法命名为接⼝内的字段
} //返回结构体字段
func (pc PhoneConnecter) Connect() { //定义结构体另⼀个⽅法,与接⼝另⼀个⽅法绑定
fmt.Println("Connected:", )
}
func main() {
var a USB //定义⼀个变量为USB接⼝类型
a = PhoneConnecter{"htc M10"} //实例化⼀个结构体,并赋值给变量(接⼝)USB
a.Connect()
Disconnect(a) //接⼝调⽤其Connect⽅法,也是结构⽅法
}
func Disconnect(usb USB) {
if pc, ok := usb.(PhoneConnecter); ok { //传⼊结构体,判断赋值是否成功
fmt.Println("Disconnected:", )
return
}
fmt.Println("UNknown device.")
}
/*输出
Connect: htc M10
Disconnect:htc M10
*/
go没有像其他语⾔继承,如python中的object表⽰元类,所有的类都继承⾃object类,go通过接⼝也类似实现了此定义,因为只要某个类型实现了某个接⼝的⽅法,我们就说此类实现了这个接⼝。因为 type empty interface{} ---空接⼝没有任何⽅法,所以可以理解为所有的接⼝都实现了空接⼝的⽅法(继承)。
package main
import "fmt"
type USB interface { //定义⼀个接⼝:⽅法的集合
Name() string //Name⽅法,返回string
Connecter //嵌⼊Connecter接⼝,可以使⽤Connecter⽅法
}
type Connecter interface { //定义另⼀个接⼝ Connecter
Connect() //包含⼀个接⼝⽅法:Connect
}
type PhoneConnecter struct { //定义⼀个结构
name string //结构包含⼀个字段
}
func (pc PhoneConnecter) Name() string { //为结构定义⼀个⽅法,绑定接⼝
return //该⽅法命名为接⼝内的字段
} //返回结构体字段
func (pc PhoneConnecter) Connect() { //定义结构体另⼀个⽅法,与接⼝另⼀个⽅法绑定
fmt.Println("Connected:", )
}
func main() {
var a USB //定义⼀个变量为USB接⼝类型
a = PhoneConnecter{"htc M10"} //实例化⼀个结构体,并赋值给变量(接⼝)USB
a.Connect()
Disconnect(a) //接⼝调⽤其Connect⽅法,也是结构⽅法
}
# func Disconnect(usb interface{}) { //集成空接⼝,也可以实现
# if pc, ok := usb.(PhoneConnecter); ok { //传⼊结构体,判断赋值是否成功