为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
犯罪嫌疑人X 2021-04-09 14:15:51
以下代码有效:type Brace interface {}type Round struct {    prev_ Brace}type Square struct {}func main() {    var r Round    var s Square    r.prev_ = s}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}由于错误:不能使用&s(* Square类型)作为* Brace赋值:* Brace是指向接口的指针,而不是接口
查看完整描述

1 回答

?
www说

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操场上检查它。尝试将指针传递给接口时,您会在代码段中发现相同的错误。


查看完整回答
反对 回复 2021-04-19
  • 1 回答
  • 0 关注
  • 222 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信