我刚刚完成Go tour,我对指针和接口感到困惑。为什么这个 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?
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,并且您不需要在变量声明中使用这种类型。
*SomeInterface
SomeInterface
接口值不是具体结构的值(因为它具有可变大小,这是不可能的),但它是一种指针(更准确地说是指向结构的指针和指向类型的指针)。Russ Cox在这里准确地描述了它:
接口值表示为两个字对,给出一个指向存储在接口中的类型信息的指针和一个指向相关数据的指针。
这就是为什么Interface,而不是*Interface保存指向实现 的结构的指针的正确类型Interface。
所以你必须简单地使用
var pi Interface