> For the complete documentation index, see [llms.txt](https://wskdsgcf.gitbook.io/mastering-go-zh-cn/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://wskdsgcf.gitbook.io/mastering-go-zh-cn/7-fan-she-he-jie-kou/07.2.md).

# 07.2 Go的接口

严格来说，Go的`interface`类型是一组需要被其他数据类型实现的函数方法的集合。对于需要满足接口的数据类型，它需要实现接口所需的所有方法。简单地说，接口是定义了一组需要被实现的函数方法的**抽象类型**，实现接口的数据类型可以视为接口的实例。如果满足以上情况，我们说数据类型实现了这个接口。因此，一个接口包含两部分：一组接口方法和一个接口类型，这样就可以定义其它数据类型的行为。

使用接口的最大优势，就是在定义函数时使用接口作为参数，那么在调用函数时，任何实现该接口类型的变量都可以作为函数的参数被传递。接口可以作为抽象类型的能力，是其最实际的价值。

> 如果发现在同一个Go包中定义了一个接口及其实现，那么可能使用了错误的接口实现方式！

两个非常常见的Go接口是`io.Reader`和`io.Writer`，用于文件输入和输出操作。具体来说，`io.Reader`用于读取文件，而`io.Writer`用于写入文件。

在代码<https://golang.org/src/io/io.go>中，`io.Reader`的定义如下：

> ```go
> type Reader interface {
>     Read(p []byte) (n int, err error)
> }
> ```

为了使类型满足`io.Reader`接口，需要实现接口中描述的`Read()`方法。

同样，在代码<https://golang.org/src/io/io.go>中的`io.Writer`的定义如下：

> ```go
> type Writer interface {
>     Write(p []byte) (n int, err error)
> }
> ```

为满足`io.Writer`接口，只需要实现一个名为`Write()`的方法。

尽管每个`io.Reader`和`io.Writer`接口都只需要实现一个方法，但是这两个接口功能都非常强大。他们功能的强大都源于他们的简单！一般来说，接口应该尽可能简单。

在下一章节中，将讲解如何定义一个接口，以及如何在其他Go包中使用。需要注意的是一个接口只要做想要实现的事情，不需要过于花哨或令人印象深刻。

> 简单地说，当需要一个Go元素确保满足某些条件或者达到某些预期行为时，应该使用接口。
