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本身。@要比较接口的基础值,您应该使用类型断言