- 主题:这2个有什么区别?
这就压根不对。你给 int 起个别名定义几个方法一样能满足 interface,用起来和指针根本两回事。结构体和结构体指针都能实现接口。
【 在 hothail 的大作中提到: 】
: golang中,interface天然是指针
:
:
: ...................
--
FROM 114.249.195.*
你这里指针类型和结构体类型都可以实现 Addifier,写
var _ Addifier = Adder{}
就不会有语法问题。
你的写法出错问题和接口实现无关,单纯就是等号后面类型转换是错的。写
(Adder)nil 不成立。
【 在 sumanwang 的大作中提到: 】
: type Addifier interface{ Add(a, b int32) int32 }
:
: type Adder struct{ name string }
: ...................
--
FROM 114.249.195.*
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.*