Rob Pike 曾说:
如果只能选择一个Go语言的特 性移植到其他语言中,他会选择接口。
看来,go的接口的设计还是一个比较突破的设计。那么他为什么这么说呢?
目前市场上大多数编程语言的接口都是侵入式的,也就是使用接口时要说明,我实现了某某接口。比如java,想要实现一个接口,就需要使用implements关键字然后加上接口名字。这样可想而知耦合度是增加了的。
其实我们要做的就是面相接口编程,但是我们到底怎么做才真正的是做到:依赖于接口而不是实现,优先使用组合而不是继承呢?
大家都知道 Duck Typing,当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。这句话是非常有哲学的,因为这句话你不知道到底是正确还是错误。假如现在有一个鸭子状的玩具摆在这里,对于一个小女孩看见可能就说这是一个鸭子。但是由于我比较喜欢吃烤鸭,当我看到这个玩具时,我只认为这就是一个玩具,不是鸭子,充其量是一个鸭子状的玩具。但是对于小女孩来说,为什么是鸭子呢?因为她看到了玩具的嘴巴扁扁的,样子和鸭子一样,所以她认为这就是鸭子。这就是因为我们关心的点不一样。
![760864da744414ea15bba7572c287531.png](https://i-blog.csdnimg.cn/blog_migrate/973f754d3648ee4b7179344d8e582587.jpeg)
图片来源于网络
首先看一下go是如何实现一个接口的,我们使用最经典的一个例子:
package mainimport ( "fmt" "reflect" "strconv")type Stringer interface { String() string}type Binary uint64func (i Binary) String() string { return strconv.FormatUint(i.Get(), 10)}func (i Binary) Get() uint64 { return uint64(i)}func main() { b := Binary(200) s := Stringer(b) fmt.Println(s.String()) fmt.Println("s 的类型: