猿问

为什么不能将* Struct分配给* Interface?

我只是在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


梵蒂冈之花
浏览 259回答 3
3回答

慕尼黑的夜晚无繁华

当您有一个实现接口的结构时,指向该结构的指针也会自动实现该接口。这就是为什么您永远都不会拥有*SomeInterface函数原型的原因,因为这不会为添加任何内容SomeInterface,并且您不需要在变量声明中使用这种类型(请参阅此相关问题)。接口值不是具体结构的值(因为它的大小可变,所以不可能),但是它是一种指针(更精确地说,是指向结构的指针和指向类型的指针)。拉斯·考克斯(Russ Cox)正是在这里描述它:接口值表示为两字对,它给出了指向有关接口中存储的类型的信息的指针以及指向相关数据的指针。这就是为什么Interface,并且不是*Interface持有指向结构实现的指针的正确类型的原因Interface。所以你必须简单地使用var pi Interface
随时随地看视频慕课网APP

相关分类

Go
我要回答