为什么我不能给*接口分配一个*结构?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (30)

我对指针和接口感到困惑。为什么这个Go代码不能编译?

package main

type Interface interface {}

type Struct struct {}

func main() {
    var ps *Struct
    var pi *Interface
    pi = ps

    _, _ = pi, ps
}

即如果StructInterface,为什么不会*Struct是一个*Interface

我得到的错误消息是:

prog.go:10: cannot use ps (type *Struct) as type *Interface in assignment:
        *Interface is pointer to interface, not interface
提问于
用户回答回答于

当你有一个实现接口的结构时,指向该结构的指针也会自动实现该接口。这就是为什么你从来没有*SomeInterface在函数的原型中,因为这不会添加任何东西SomeInterface,并且你不需要在变量声明中使用这种类型。

接口值不是具体结构的值(因为它具有可变大小,这是不可能的),但它是一种指针(更精确地指向结构的指针和指向类型的指针)。

接口值表示为一个双字对,给出一个指向存储在接口中的类型信息的指针和一个指向关联数据的指针。

这就是为什么Interface,而不是*Interface持有指向实现的结构的指针的正确类型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
}

扫码关注云+社区