Interface
Golang 中interface的理解,首先要明确一些常识:
- interface 可以表示一种类型(任意一种类型)
- interface 是方法的集合(也就是接口的方法集合)
- 只要实现了接口中的所有方法,那么就认为你实现了这个接口(称之为 Duck typing)
Duck typing:是多态(polymorphism)的一种形式.在这种形式中,不管对象属于哪个,也不管声明的具体接口是什么,只要对象实现了相应的方法,函数就可以在对象上执行操作.即忽略对象的真正类型,转而关注对象有没有实现所需的方法、签名和语义.
’如果它走起步来像鸭子,并且叫声像鸭子, 那个它一定是一只鸭子.'
interface 就是一组抽象方法的集合,它必须由其他非interface类型实现,而不能自我实现;
interface 可以被任意对象实现,一个类型/对象也可以实现多个 interface
方法不能重载,如 eat(), eat(s string) 不能同时存在
Example:
package main
import "fmt"
type Phone interface {
call()
}
type NokiaPhone struct {
}
func (nokiaPhone NokiaPhone) call() {
fmt.Println("I am Nokia, I can call you!")
}
type ApplePhone struct {
}
func (iPhone ApplePhone) call() {
fmt.Println("I am Apple Phone, I can call you!")
}
func main() {
var phone Phone
phone = new(NokiaPhone)
phone.call()
phone = new(ApplePhone)
phone.call()
}
如果接口A实现了接口B中所有方法,那么A可以转化为B接口。
利用struct去实现接口之后,我们就可以用这个struct作为接口参数,使用那些接收接口参数的方法完成我们的功能。这也是面向接口编程的方式,我们的功能依据接口来实现,而不用关心实现接口的是什么,这样大大提供了功能的通用性可扩展性。
func PhoneCall(phone Phone) {
phone.call()
}
func main() {
var ph1 Phone
iphone := &iPhone
ph1 = iphone
PhoneCall(ph1 )
}