猿问

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

以下代码有效:


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是指向接口的指针,而不是接口


犯罪嫌疑人X
浏览 223回答 1
1回答

www说

如错误所示:不能使用&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操场上检查它。尝试将指针传递给接口时,您会在代码段中发现相同的错误。
随时随地看视频慕课网APP

相关分类

Go
我要回答