当前位置: 首页 > 知识库问答 >
问题:

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

边桐
2023-03-14

我只是在进行围棋之旅,我对指针和接口感到困惑。为什么这个Go代码不编译?

package main

type Interface interface {}

type Struct struct {}

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

    _, _ = pi, ps
}

也就是说,如果结构是一个接口,为什么*结构不是一个*接口

我收到的错误消息是:

prog.go:10: cannot use ps (type *Struct) as type *Interface in assignment:
        *Interface is pointer to interface, not interface

共有3个答案

颛孙昆
2023-03-14

下面是将结构分配给接口的一种非常简单的方法:

package main

type Interface interface{}

type Struct struct{}

func main() {
    ps := new(Struct)
    pi := Interface(ps)

    _, _ = pi, ps
}

https://play.golang.org/p/BRTaTA5AG0S

邓欣可
2023-03-14

这也许就是你的意思:

package main

type Interface interface{}

type Struct struct{}

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

        _, _ = pi, ps
}

编译OK。请参见此处。

满雨石
2023-03-14

当您有一个实现接口的结构时,指向该结构的指针也会自动实现该接口。这就是为什么在函数的原型中从来没有*SomeInterface,因为这不会向SomeInterface添加任何内容,并且在变量声明中也不需要这样的类型(请参见此相关问题)。

接口值不是具体结构的值(因为它有可变大小,这是不可能的),但它是一种指针(更准确地说,是指向结构的指针和指向类型的指针)。拉斯·考克斯在这里准确地描述了它:

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

这就是为什么接口,而不是*接口是保存指向实现接口的结构的指针的正确类型。

所以你必须简单地使用

var pi Interface
 类似资料:
  • 问题内容: 以下语句: 因错误而失败: 为什么在这里需要演员表? 我发现了几篇文章,解释了为什么您不能进行反向操作(将T分配给a),但这是显而易见的(可以理解)。 注意:我在Eclipse Luna下对此进行编码,所以我不知道这是Luna Quirk还是泛型中确实不了解的东西。 问题答案: 协方差vs协方差vs不变性 是 不变的 。 结果是, 是 不是一个亚型 的 在Java中,变量可以保存 相同

  • 问题内容: 我试图为对象类型分配一个lambda: 它给我一个错误的说法: 为什么会这样,怎么做? 问题答案: 这是不可能的。根据错误消息不是功能接口,即具有单个公共方法的接口,因此您需要使用引用类型,例如

  • 以下代码编译确定: 但是嵌套列表不会: 这是为什么?如果我需要这样做,“正确”的方法是什么? 用例是我有一个方法,它返回许多不同集合中的一个,其中元素类型本身是泛型的,每个可能的返回值都有不同的定义类型,其中返回值取决于传入的参数。目前,作为一种解决方法,我将结果分配给一个变量,其中类型是带有通配符的集合类型(即<code>列表

  • 问题内容: 使用Java5,我们可以编写: 或仅在for循环中使用Iterable。这非常方便。 但是,您不能像这样编写可迭代的通用方法: 并使用数组调用它,因为它不是Iterable: 我想知道这个设计决定背后的原因。 问题答案: 数组可以实现接口(和)。那为什么不呢?我猜想Iterable强制添加方法,而数组不实现方法。甚至不覆盖。无论如何,应将引用数组视为不理想的-使用。如dfa注释所示,将

  • 问题内容: 我是Java或Selenium的新手。 我只需要帮助来了解一个基本问题。 为什么我们将firefoxdriver实例分配给WebDriver?WebDriver driver =新的FirefoxDriver() 我知道这是Java中的后期绑定,因为我们可以在以后的时间将IEDriver或其他实例分配给WebDriver。 问题1:但这适用于课堂,对吗? Question2:WebDr

  • 我是Java或Selenium的新手。 我只需要帮助理解一个基本问题。 为什么我们将Firefox驱动实例分配给WebDriver?WebDriver驱动程序=new FirefoxDriver() 我知道这是Java中的后期绑定,因为我们可以在稍后的时间点将IEDriver或其他实例分配给WebDriver。 问题1:但这适用于课堂,对吗? 问题2:WebDriver是一个接口,那么我们可以创建