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

Pointers 指向接口的指针不是接口错误吗?,pointers,inheritance,go,Pointers,Inheritance,Go,以下代码起作用: type Brace interface {} type Round struct { prev_ Brace } type Square struct {} func main() { var r Round var s Square r.prev_ = s } r.prev\uu现在是s的副本,这是真的吗?如何更改圆将包含指向大括号的指针?此代码不起作用: type Brace interface {} type Round str

以下代码起作用:

type Brace interface {}

type Round struct {
    prev_ Brace
}

type Square struct {}

func main() {
    var r Round
    var s Square
    r.prev_ = s
}
r.prev\uu
现在是
s
的副本,这是真的吗?如何更改圆将包含指向大括号的指针?此代码不起作用:

type Brace interface {}

type Round struct {
    prev_ *Brace
}

type Square struct {}

func main() {
    var r Round
    var s Square
    r.prev_ = &s
}
由于错误:

无法将&s(类型*方形)用作赋值中的类型*大括号: *大括号是指向接口的指针,而不是接口

正如错误所说:

无法将&s(类型*方形)用作赋值中的类型*大括号:*大括号无效 指向接口而不是接口的指针

接口可以包装任何类型的值。但您是在指针类型接口中包装结构,而不是接口。在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)
}

在Golang中,应避免将指针传递到接口,如下所示:

编译器将对此错误进行投诉,但这种情况可能会发生 仍然会令人困惑,因为有时需要一个指针来 满足一个接口。洞察是,尽管指向 具体类型可以满足接口,但指针除外 对一个接口的访问永远不能满足一个接口

考虑变量声明

var w io.Writer
打印函数fmt.Fprintf将满足io.Writer的值作为其第一个参数,该值实现了规范写入方法。这样我们就可以写作了

fmt.Fprintf(w, "hello, world\n")
然而,如果我们传递w的地址,程序将无法编译

fmt.Fprintf(&w, "hello, world\n") // Compile-time error.
唯一的例外是任何值,甚至是指向接口的指针, 可以分配给空接口类型(接口{})的变量。 即便如此,如果该值是指向 接口;结果可能令人困惑


检查一下。当您试图将指针传递到接口时,您会发现代码片段中出现的错误与此相同。

忘记在Go中尝试传统的、基于继承的OOP:无论您多么努力,它都不起作用。真正地重新设计。在围棋中执行(甚至模仿)传统的OOP只会导致错误、问题和痛苦。这样做毫无益处。正如@Volker所说,Golang不像面向对象技术那样工作。在围棋中,界面的工作方式是不同的。非常感谢,但是你能演示一下吗?谢谢!但是这种方式
类型(r.prev)=大括号
,而不是
正方形
。在我的第一段代码中,
r.prev\uu
现在是
s
的一个副本,对吗?@臭名昭著的是,在go lang中,每件事都是按值传递的。因此,您传递的是struct的副本,而不是struct本身。@要比较接口的基础值,您应该使用类型断言