2 回答

TA貢獻(xiàn)1898條經(jīng)驗(yàn) 獲得超8個贊
只需添加&
到Bar{}
并使其成為指針接收器,如下所示:
fmt.Println(&Bar{}) // "Bar"
這里對輸出的代碼進(jìn)行了一些調(diào)整:
Foo Bar
看:
package main
import "fmt"
type Foo struct{}
func (Foo) String() string {
return "Foo"
}
type Bar struct{}
func (*Bar) String() string {
return "Bar"
}
func main() {
fmt.Println(Foo{}) // "Foo"
pb := &Bar{}
fmt.Println(pb) // "Bar"
}
筆記:
收件人姓名應(yīng)反映其身份;不要使用通用名稱,例如“this”或“self”
你的例子不需要名字。
很高興閱讀Golang 方法接收器:
值接收者對原始類型值的副本進(jìn)行操作。這意味著涉及成本,尤其是在結(jié)構(gòu)非常大的情況下,接收到的指針效率更高。

TA貢獻(xiàn)1794條經(jīng)驗(yàn) 獲得超8個贊
因?yàn)?Bar 沒有實(shí)現(xiàn)stringer
*Bar 。
如果您從 Foo 中刪除的實(shí)現(xiàn)stringer
,您將獲得“{}”。
同樣,當(dāng)你寫fmt.Println(Bar{})
它意味著它會尋找類似func (Bar) String()
而不是func (*Bar) String()
另外,當(dāng)你寫的時候故事是不同的fmt.Println(&Foo{})
,你可能認(rèn)為它會打印“{}”因?yàn)闆]有func (*Foo) String()
但它會打印“Foo”。
為此,您將必須了解接口。這些是我的經(jīng)驗(yàn),所以請也做你自己的研究。該fmt.Print
函數(shù)對傳遞的參數(shù)調(diào)用 String()。所以實(shí)際上 String() 不是在你的結(jié)構(gòu)上調(diào)用的,而是一個類型為 stringer 的變量。
接口類型可以包含一個類型(實(shí)現(xiàn)它的)或指向它的指針,如果它是用值接收器實(shí)現(xiàn)的。這就是為什么
Foo{}
兩者&Foo{}
都有效。接口類型只能保存一個類型的指針(實(shí)現(xiàn)它的指針),前提是它是用指針接收器實(shí)現(xiàn)的。為什么?因?yàn)楫?dāng)你實(shí)現(xiàn)一個帶有指針接收器的接口時,它需要一個只能用指針提供的地址。這就是為什么只
&Bar{}
起作用而不起作用的原因Bar{}
- 2 回答
- 0 關(guān)注
- 177 瀏覽
添加回答
舉報