为什么我不能将* 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。 另见这里 。