1 回答

TA貢獻(xiàn)1775條經(jīng)驗(yàn) 獲得超8個(gè)贊
如錯(cuò)誤所示:
不能使用&s(* Square類(lèi)型)作為* Brace賦值:* Brace是指向接口的指針,而不是接口
接口可以包裝任何類(lèi)型的值。但是,您將結(jié)構(gòu)包裝在指針類(lèi)型的接口而不是接口中。那不是接口在golang中的工作方式。
如果要傳遞結(jié)構(gòu)的地址。接口可以將指針包裝為struct。無(wú)需創(chuàng)建指向接口的指針即可實(shí)現(xiàn)此目的。
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)
}
操場(chǎng)上的例子
在Golang中,您應(yīng)該避免將接口的指針傳遞為:
編譯器會(huì)抱怨該錯(cuò)誤,但情況仍然令人困惑,因?yàn)橛袝r(shí)需要一個(gè)指針來(lái)滿足接口。洞察力是,盡管指向具體類(lèi)型的指針可以滿足接口,但有一個(gè)例外,指向接口的指針永遠(yuǎn)不能滿足接口。
考慮變量聲明,
var w io.Writer
打印函數(shù)fmt.Fprintf將滿足io.Writer的值作為第一個(gè)參數(shù),該值實(shí)現(xiàn)了規(guī)范的Write方法。這樣我們可以寫(xiě)
fmt.Fprintf(w, "hello, world\n")
但是,如果我們傳遞w的地址,則該程序?qū)o(wú)法編譯。
fmt.Fprintf(&w, "hello, world\n") // Compile-time error.
一個(gè)例外是,任何值,甚至是指向接口的指針,都可以分配給空接口類(lèi)型(interface {})的變量。即使這樣,如果值是指向接口的指針,幾乎可以肯定是一個(gè)錯(cuò)誤。結(jié)果可能會(huì)令人困惑。
在Go操場(chǎng)上檢查它。嘗試將指針傳遞給接口時(shí),您會(huì)在代碼段中發(fā)現(xiàn)相同的錯(cuò)誤。
- 1 回答
- 0 關(guān)注
- 260 瀏覽
添加回答
舉報(bào)