go语言的interface为什么好用?

2020-07-09 00:00:00 都是 接口 方法 类型 鸭子

Rob Pike 曾说:

如果只能选择一个Go语言的特 性移植到其他语言中,他会选择接口。


看来,go的接口的设计还是一个比较突破的设计。那么他为什么这么说呢?

目前市场上大多数编程语言的接口都是侵入式的,也就是使用接口时要说明,我实现了某某接口。比如java,想要实现一个接口,就需要使用implements关键字然后加上接口名字。这样可想而知耦合度是增加了的。

其实我们要做的就是面相接口编程,但是我们到底怎么做才真正的是做到:依赖于接口而不是实现,优先使用组合而不是继承呢?

大家都知道 Duck Typing,当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。这句话是非常有哲学的,因为这句话你不知道到底是正确还是错误。假如现在有一个鸭子状的玩具摆在这里,对于一个小女孩看见可能就说这是一个鸭子。但是由于我比较喜欢吃烤鸭,当我看到这个玩具时,我只认为这就是一个玩具,不是鸭子,充其量是一个鸭子状的玩具。但是对于小女孩来说,为什么是鸭子呢?因为她看到了玩具的嘴巴扁扁的,样子和鸭子一样,所以她认为这就是鸭子。这就是因为我们关心的点不一样。



图片来源于网络


首先看一下go是如何实现一个接口的,我们使用经典的一个例子:

package main
import (
 "fmt"
 "reflect"
 "strconv"
)
type Stringer interface {
 String() string
}
type Binary uint64
func (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 的类型:", reflect.TypeOf(s))
}

相关文章