在Go语言中,interface(接口)是一种数据类型,类比到java的interface,用于定义一组标准或行为。其他类型如果实现了interface中的所有方法,那么就可以称为实现了这个接口。
基本用法:
type Phone interface {
call()
}
type NokiaPhone struct {
}
func (nokiaPhone NokiaPhone) call() {
fmt.Println("I am Nokia, I can call you!")
}
type IPhone struct {
}
func (iPhone IPhone) call() {
fmt.Println("I am iPhone, I can call you!")
}
func main() {
var phone Phone
phone = new(NokiaPhone)
phone.call()
phone = new(IPhone)
phone.call()
}
代码中IPhone和NokiaPhone均实现了Phone这个接口,因此他们的实例可以调用call()方法。
注意phone = new(NokiaPhone)也可以写作phone = &NokiaPhone{}。
接口作为参数:
type Phone interface {
call() string
}
type Android struct {
brand string
}
type IPhone struct {
version string
}
func (android Android) call() string {
return "I am Android :" + android.brand
}
func (iPhone IPhone) call() string {
return "I am iPhone " + iPhone.version
}
func printCall(p Phone) {
fmt.Println(p.call() + ", I can call you!")
}
func main() {
var vivo = Android{"Vivo"}
var hw = Android{"HuaWei"}
i7 := IPhone{"11"}
ix := IPhone{"X"}
printCall(vivo)
printCall(hw)
printCall(i7)
printCall(ix)
}
printCall()函数传入参数类型为Phone接口类型,但vivo、hw等均是Android结构体的实例,而Android实现了Phone接口,因此可以正常传入。
如果想要通过接口的方法修改接收者的属性值,那么接收者需要定义为指针类型,即
func (android *Android) call() string {。。。}