为什么我不能将* Struct分配给*接口?
我只是通过Go游览 ,我对指针和接口感到困惑。 为什么这个Go代码不能编译?
package main type Interface interface {} type Struct struct {} func main() { var ps *Struct var pi *Interface pi = ps _, _ = pi, ps }
即如果Struct
是一个Interface
,为什么不*Struct
一个*Interface
?
我得到的错误消息是:
prog.go:10: cannot use ps (type *Struct) as type *Interface in assignment: *Interface is pointer to interface, not interface
当你有一个实现一个接口的结构时,指向这个结构的指针也会自动实现这个接口。 这就是为什么在函数原型中永远不会有*SomeInterface
,因为这不会在SomeInterface
添加任何东西,并且在variables声明中不需要这样的types(参见这个相关的问题 )。
一个接口的值不是具体结构的值(因为它有一个可变的大小,这是不可能的),但它是一种指针(更精确的指向结构的指针和types的指针)。 Russ Cox正是在这里描述的:
接口值被表示为一个双字对,它给出一个关于存储在接口中的types信息的指针和一个指向相关数据的指针。
这就是为什么Interface
,而不是*Interface
是一个正确的types来保存指向实现Interface
的结构的指针。
所以你必须简单地使用
var pi Interface
这也许是你的意思:
package main type Interface interface{} type Struct struct{} func main() { var ps *Struct var pi *Interface pi = new(Interface) *pi = ps _, _ = pi, ps }
编译OK。 另见这里 。