指向接口的指针不是接口错误?

InF*_*s X 0 inheritance pointers go

以下代码有效:

type Brace interface {}

type Round struct {
    prev_ Brace
}

type Square struct {}

func main() {
    var r Round
    var s Square
    r.prev_ = s
}
Run Code Online (Sandbox Code Playgroud)

这是真的,r.prev_现在是副本s吗?如何更改Round将包含指向Brace的指针?此代码不起作用:

type Brace interface {}

type Round struct {
    prev_ *Brace
}

type Square struct {}

func main() {
    var r Round
    var s Square
    r.prev_ = &s
}
Run Code Online (Sandbox Code Playgroud)

因为错误:

不能使用&s(类型*Square)作为类型*Brace赋值:*Brace是指向接口的指针,而不是接口

Him*_*shu 8

正如错误所说:

不能使用&s(类型*Square)作为类型*Brace赋值:*Brace是指向接口的指针,而不是接口

接口可以包装任何类型的值.但是你将结构包含在指针类型接口内而不是接口中.这不是golang中接口的工作方式.

如果要传递结构的地址.接口可以直接将指针包装到struct.无需创建指向接口的指针即可实现该目的.

type Brace interface {}

type Round struct {
    prev_ Brace
}

type Square struct {}

func main() {
    var r Round
    var s Square
    r.prev_ = &s
    fmt.Printf("%#v", r)
}
Run Code Online (Sandbox Code Playgroud)

游乐场示例

在Golang中,您应该避免将指针传递给接口:

编译器会抱怨此错误,但情况仍然令人困惑,因为有时需要指针来满足接口.深刻的是,虽然指向具体类型的指针可以满足接口,但有一个例外,指向接口的指针永远不能满足接口.

考虑变量声明,

var w io.Writer
Run Code Online (Sandbox Code Playgroud)

打印函数fmt.Fprintf将第一个参数作为满足io.Writer的值 - 实现规范Write方法.因此我们可以写

fmt.Fprintf(w, "hello, world\n")
Run Code Online (Sandbox Code Playgroud)

但是,如果我们传递w的地址,程序将无法编译.

fmt.Fprintf(&w, "hello, world\n") // Compile-time error.
Run Code Online (Sandbox Code Playgroud)

一个例外是任何值,甚至是指向接口的指针,都可以分配给空接口类型的变量(interface {}).即便如此,如果值是指向接口的指针,几乎肯定是错误的; 结果可能令人困惑.

Go操场上看看吧.在尝试将指针传递给接口时,您会在代码片段中发现相同的错误.