1 回答
TA贡献1775条经验 获得超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)
}
操场上的例子
在Golang中,您应该避免将接口的指针传递为:
编译器会抱怨该错误,但情况仍然令人困惑,因为有时需要一个指针来满足接口。洞察力是,尽管指向具体类型的指针可以满足接口,但有一个例外,指向接口的指针永远不能满足接口。
考虑变量声明,
var w io.Writer
打印函数fmt.Fprintf将满足io.Writer的值作为第一个参数,该值实现了规范的Write方法。这样我们可以写
fmt.Fprintf(w, "hello, world\n")
但是,如果我们传递w的地址,则该程序将无法编译。
fmt.Fprintf(&w, "hello, world\n") // Compile-time error.
一个例外是,任何值,甚至是指向接口的指针,都可以分配给空接口类型(interface {})的变量。即使这样,如果值是指向接口的指针,几乎可以肯定是一个错误。结果可能会令人困惑。
在Go操场上检查它。尝试将指针传递给接口时,您会在代码段中发现相同的错误。
- 1 回答
- 0 关注
- 218 浏览
添加回答
举报