# 11.1 接口是什么 Go 语言不是一种 *“传统”* 的面向对象编程语言:它里面没有类和继承的概念。 但是 Go 语言里有非常灵活的 **接口** 概念,通过它可以实现很多面向对象的特性。接口提供了一种方式来 **说明** 对象的行为:如果谁能搞定这件事,它就可以在用在这儿。 接口定义了一组方法(方法集),但是这些方法不包含(实现)代码:它们没有被实现(它们是抽象的)。接口里也不能包含变量。 通过如下格式定义接口: ```go type Namer interface { Method1(param_list) return_type Method2(param_list) return_type ... } ``` 上面的 `Namer` 是一个 **接口类型**. (按照约定,只包含一个方法的)接口的名字由方法名加 `[e]r` 后缀组成,例如 `Printer`、`Reader`、`Writer`、`Logger`、`Converter`等等。还有一些不常用的方式(当后缀`er`不合适时),比如`Recoverable`,此时接口名以`able`结尾,或者以 `I` 开头(像 `.NET` 或 `Java` 中那样)。 Go 语言中的接口都很简短,通常它们会包含0个、最多3个方法。 不像大多数面向对象编程语言,在 Go 语言中接口可以有值,一个接口类型的变量或一个 **接口值** :`var ai Namer`,`ai`是一个多字(multiword)数据结构,它的值是 `nil`。它本质上是一个指针,虽然不完全是一回事。指向接口值的指针是非法的,它们不仅一点用也没有,还会导致代码错误。 ![](images/11.1_fig11.1.jpg?raw=true) 此处的方法指针表是通过运行时反射构建的。 - [目录](directory.md) - 上一章:[11 接口(Interfaces)与反射(reflection)](11.0.md) - 下一节:[接口内嵌接口](11.2.md)