Go 有个我认为比较怪的特性,就是一方面类型方法的 receiver(一般怎么翻译?)既可以是值类型也可以是指针类型,另一方面如果方法是通过值类型定义的,则既可以通过值类型也可以通过指针类型调用。
造成的结果就是你这里定义的类型,不仅 Adder 实现了 Addifier,*Adder 也实现了 Addifier。
这是有意的设计,不过可能多少容易引起概念上的混淆。
又及,把 interface 看成指针是更大的易混淆概念了。go 是值语义的,包括 interface 变量也是值语义的。给 interface 类型的变量 i1 传一个结构体值 s,再赋值给另一个 interface 变量 i2,那么 i1 和 i2 里面打包保存的两个值 s 就是独立的两个副本,互不干扰的(值语义),而不是指向同一对象的指针一个所指对象变化另一边看到该对象跟着变。
interface 就是显式带虚表的对象类型,内部实现对象值是通过指针分配内存但不影响语义是纯值语义的。
【 在 sumanwang 的大作中提到: 】
: type Addifier interface{ Add(a, b int32) int32 }
:
: type Adder struct{ name string }
: ...................
--
FROM 114.249.195.*