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是指向接口的指针,而不是接口
正如错误所说:
不能使用&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操场上看看吧.在尝试将指针传递给接口时,您会在代码片段中发现相同的错误.