精髓
《go语言实战》5.4.3方法集。要理解方法集的含义!方法集与接口密切相关。
代码清单 5-42 展示了规范里对方法集的描述。描述中说到,T 类型的值的方法集只包含值
接收者声明的方法。而指向 T 类型的指针的方法集既包含值接收者声明的方法,也包含指针接收
者声明的方法。从值的角度看这些规则,会显得很复杂。让我们从接收者的角度来看一下这些规
则,如代码清单 5-43 所示。
代码清单 5-43 展示了同样的规则,只不过换成了接收者的视角。这个规则说,如果使用指
针接收者来实现一个接口,那么只有指向那个类型的指针才能够实现对应的接口。如果使用值
接收者来实现一个接口,那么那个类型的值和指针都能够实现对应的接口。
存储实现
接口值是一个两个字长度
的数据结构,第一个字包含一个指向内部表的指针。这个内部表叫作 iTable,包含了所存储的
值的类型信息。iTable 包含了已存储的值的类型信息以及与这个值相关联的一组方法。第二个
字是一个指向所存储值的指针。将类型信息和指针组合在一起,就将这两个值组成了一种特殊
的关系。
图 5-2 展示了一个指针赋值给接口之后发生的变化。在这种情况里,类型信息会存储一个指
向保存的类型的指针,而接口值第二个字依旧保存指向实体值的指针。
另外
没理解下面这句话:
因为不是总能获取一个值的地址,所以值的方法集只包括了使用值接收者实现的方法。