亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

方法集(指針與值接收器)

方法集(指針與值接收器)

Go
智慧大石 2021-11-22 15:06:47
我很難理解為什么這些規則與指針類型 .vs 的方法集相關聯。值類型有人可以解釋原因嗎(從接口表的角度)(摘自威廉肯尼迪的博客)Values          Methods Receivers-----------------------------------------------T               (t T)*T              (t T) and (t *T)Methods Receivers    Values-----------------------------------------------(t T)                 T and *T(t *T)                *T規范的片段方法集一個類型可能有一個與之關聯的方法集。接口類型的方法集就是它的接口。任何其他類型 T 的方法集由所有以接收者類型 T 聲明的方法組成。 對應指針類型 *T 的方法集是所有以接收者 *T 或 T 聲明的方法的集合(即,它還包含方法組 T)。更多規則適用于包含匿名字段的結構,如結構類型部分所述。任何其他類型都有一個空的方法集。在一個方法集中,每個方法必須有一個唯一的非空方法名。類型的方法集決定了該類型實現的接口以及可以使用該類型的接收器調用的方法。
查看完整描述

2 回答

?
郎朗坤

TA貢獻1921條經驗 獲得超9個贊

來自Golang 常見問題解答

正如 Go 規范所說,類型 T 的方法集由接收器類型為 T 的所有方法組成,而對應指針類型 *T 的方法集由接收器類型為 *T 或 T 的所有方法組成。 這意味著 *T 的方法集包括 T 的,但不包括相反的。

出現這種區別是因為如果接口值包含指針 *T,則方法調用可以通過取消引用指針來獲取值,但是如果接口值包含值 T,則方法調用沒有安全的方法獲取指針。(這樣做將允許方法修改接口內的值的內容,這是語言規范所不允許的。)

即使在編譯器可以將值的地址傳遞給方法的情況下,如果方法修改了值,則更改將在調用者中丟失。例如,如果 bytes.Buffer 的 Write 方法使用值接收器而不是指針,則此代碼:

var buf bytes.Buffer
io.Copy(buf, os.Stdin)

會將標準輸入復制到 buf 的副本中,而不是復制到 buf 本身中。這幾乎從來都不是理想的行為。


查看完整回答
反對 回復 2021-11-22
?
開心每一天1111

TA貢獻1836條經驗 獲得超13個贊

  1. 如果您有一個,*T您可以調用接收器類型*T為 的方法以及接收器類型為T(您引用的段落, 方法集)的方法。

  2. 如果您有 aT并且它是可尋址的,您可以調用接收器類型*T為 的方法以及接收器類型為T的方法,因為方法調用t.Meth()將等效于(&t).Meth()Calls )。

  3. 如果您有 aT并且它不可尋址(例如,函數調用的結果,或索引到映射的結果),Go 無法獲得指向它的指針,因此您只能調用具有 a 的方法的接收器類型T,不是*T

  4. 如果您有一個接口I,并且I的方法集中的部分或全部方法由接收器為 的方法提供*T(其余方法由接收器為 的方法提供T),則*T滿足接口I,但T不滿足。那是因為*T的方法集包括T's,但不是相反的(再次回到第一點)。

簡而言之,您可以混合和匹配帶有值接收器的方法和帶有指針接收器的方法,并將它們與包含值和指針的變量一起使用,而不必擔心哪個是哪個。兩者都可以使用,并且語法相同。然而,如果需要帶有指針接收器的方法來滿足接口,那么只有一個指針可以分配給接口——一個值將是無效的。


查看完整回答
反對 回復 2021-11-22
  • 2 回答
  • 0 關注
  • 167 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號