Go的接口
严格来说,Go的interface
类型是一组需要被其他数据类型实现的函数方法的集合。对于需要满足接口的数据类型,它需要实现接口所需的所有方法。简单地说,接口是定义了一组需要被实现的函数方法的抽象类型,实现接口的数据类型可以视为接口的实例。如果满足以上情况,我们说数据类型实现了这个接口。因此,一个接口包含两部分:一组接口方法和一个接口类型,这样就可以定义其它数据类型的行为。
使用接口的最大优势,就是在定义函数时使用接口作为参数,那么在调用函数时,任何实现该接口类型的变量都可以作为函数的参数被传递。接口可以作为抽象类型的能力,是其最实际的价值。
如果发现在同一个Go包中定义了一个接口及其实现,那么可能使用了错误的接口实现方式!
两个非常常见的Go接口是io.Reader
和io.Writer
,用于文件输入和输出操作。具体来说,io.Reader
用于读取文件,而io.Writer
用于写入文件。
在代码https://golang.org/src/io/io.go中,io.Reader
的定义如下:
type Reader interface {
Read(p []byte) (n int, err error)
}
为了使类型满足io.Reader
接口,需要实现接口中描述的Read()
方法。
同样,在代码https://golang.org/src/io/io.go中的io.Writer
的定义如下:
type Writer interface {
Write(p []byte) (n int, err error)
}
为满足io.Writer
接口,只需要实现一个名为Write()
的方法。
尽管每个io.Reader
和io.Writer
接口都只需要实现一个方法,但是这两个接口功能都非常强大。他们功能的强大都源于他们的简单!一般来说,接口应该尽可能简单。
在下一章节中,将讲解如何定义一个接口,以及如何在其他Go包中使用。需要注意的是一个接口只要做想要实现的事情,不需要过于花哨或令人印象深刻。
简单地说,当需要一个Go元素确保满足某些条件或者达到某些预期行为时,应该使用接口。