type Person interface {
GetAge() int
GetName() string
}
type Car interface {
GetAge() int
GetName() string
}
type Student struct {
age int
name string
}
func (s Student) GetAge() int {
return s.age
}
func (s Student) GetName() string {
return s.name
}
这里有两个接口 Person、Car 他们有相同的方法,而 Student 实现了这两个方法,在 Go 里边就可以说他同时实现了这两个接口,不信你试试
func main() {
var p Person= Student{20, "Elon"}
fmt.Println("This person name is", p.GetName())
fmt.Println("This person age is", p.GetAge())
var c Car= Student{1, "BMW"}
fmt.Println("This car name is", c.GetName())
fmt.Println("This car age is", c.GetAge())
}
这里只是为了说明问题,名字上看起来有点诡异(Student 竟然可以是车?上车就是上 Student?)
这种能力带来的真正让人吃惊的地方是什么?从此以后我可以先写类了,我先根据实际情况把类的功能做好,在某个我具体需要使用的地方,我再定义接口。说的专业点:也就是接口是由使用方根据自己真实需求来定义,并且不用关心是否有其它使用方定义过。
这样子到底解决了什么开发中的问题?举个例子:我们一个大团队在开发一个商城系统,m端、app端、pc端都有购物车的需求,底层根据不同的需求已经实现了一个Cart类,通过该类可以获取购物车价格、数量等。例如:
type Cart struct {
price float32
num int
}
func (c Cart) GetPrice() float32 {
return c.price
}
func (c Cart) GetNum() int {
return c.num
}
这个时候前端要进行调用了,他们可以自由定义接口名称用于接受,只需要关心自己的接口需要什么方法,Cart 是否全部实现了需要的方法,每一个端完全可以自己定义一个接口,接口名称、定义的方法顺序都可以不同。
我觉得这才是真正做到了:依赖于接口而不是实现,优先使用组合而不是继承
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对易采站长站的支持。










