第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

結(jié)構(gòu)的方法簽名之間的區(qū)別

結(jié)構(gòu)的方法簽名之間的區(qū)別

Go
有只小跳蛙 2023-05-15 15:08:38
作為一名來自 C++ 等其他語言的程序員,我覺得很奇怪,go 允許為允許指針或?qū)嵗鳛閰?shù)的結(jié)構(gòu)指定方法。根據(jù)go by example,如果我們不想修改原點(diǎn),once 可以使用它們中的任何一個:Go 自動處理方法調(diào)用的值和指針之間的轉(zhuǎn)換。您可能希望使用指針接收器類型來避免在方法調(diào)用上進(jìn)行復(fù)制或允許該方法改變接收結(jié)構(gòu)。考慮以下代碼:package mainimport (    "fmt")type Foo struct {}type Bar struct {}func (this Foo) String() string {  return "Foo"}func (this *Bar) String() string {  return "Bar"}func main() {  fmt.Println(Foo{}) // "Foo"  fmt.Println(Bar{}) // "{}"}為什么我不能同時使用兩個簽名版本來修改結(jié)構(gòu)的stringify(我不知道它在 go 中實(shí)際上是如何調(diào)用的)行為?明確一點(diǎn):我并不真正關(guān)心字符串化,但想了解語言的行為方式。
查看完整描述

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)非常大的情況下,接收到的指針效率更高。


查看完整回答
反對 回復(fù) 2023-05-15
?
幕布斯7119047

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{}


查看完整回答
反對 回復(fù) 2023-05-15
  • 2 回答
  • 0 關(guān)注
  • 177 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號