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

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

Go 中基類型方法指針的選擇器

Go 中基類型方法指針的選擇器

Go
largeQ 2023-07-17 16:30:08
很明顯,下面的代碼可以正常工作:package mainimport "fmt"type T struct {    a int}func (t T) M() {    fmt.Println("M method")}func main() {    var t = &T{1}    t.M() // it's interesting}但正如我從規范中看到的:對于 T 或 *T 類型的值 x(其中 T 不是指針或接口類型),xf 表示 T 中最淺深度處存在 f 的字段或方法。如果不存在恰好一個深度最淺的 f,則選擇器表達式是非法的。但在示例中M不是來自*T,而是來自T。我知道其中*T包括 的方法集T,但正如我所見,規范并沒有告訴我們有關 的方法集*T。我是否理解帶有注釋的行的規范錯誤或正確性是基于其他規范規則?
查看完整描述

2 回答

?
波斯汪

TA貢獻1811條經驗 獲得超4個贊

你引用:

x.f表示最淺深度的字段或方法T

引文指的是深度。深度的“定義”是:

選擇器可以表示類型的f字段或方法,也可以指的嵌套嵌入字段的字段或方法。遍歷到達的嵌入字段的數量稱為它的深度。中聲明的字段或方法的深度為零。在嵌入字段in中聲明的字段或方法的深度是in的深度加一。fTfTfTfTfATfA

關鍵是嵌入。您的結構不嵌入單一類型。所以根據定義, your的深度T.M為零。

您的t變量是類型*T(即表達式的類型&T{},它采用結構復合文字的地址:它生成一個指向用文字值初始化的唯一變量的指針)。

并引用規范:方法值:

與選擇器一樣,使用指針對具有值接收器的非接口方法的引用將自動取消對該指針的引用:pt.Mv相當于(*pt).Mv。

t.M是對非接口方法 的引用T.M,并且由于t是指針,因此它將自動取消引用:(*t).M()

現在讓我們看一個例子,其中“最淺深度”確實很重要。

type T struct{}


func (t T) M() { fmt.Println("T.M()") }


type T2 struct {

? ? T // Embed T

}


func (t T2) M() { fmt.Println("T2.M()") }


func main() {

? ? var t T = T{}

? ? var t2 T2 = T2{T: t}

? ? t2.M()

}

在main()我們調用t2.M(). 由于T2嵌入T,這可以指T2.T.Mand T2.M。但由于 的 深度T2.T.M是1, 的 深度T2.M是0,T2.M處于 中最淺的深度T2,因此t2.M將表示T2.M且 not ,因此上面的示例打?。ㄔ贕o PlaygroundT2.T.M上嘗試):


T2.M()


查看完整回答
反對 回復 2023-07-17
?
四季花海

TA貢獻1811條經驗 獲得超5個贊

來自方法集:

對應指針類型*T的方法集是用接收者*T或T聲明的所有方法的集合(即也包含T的方法集)。


查看完整回答
反對 回復 2023-07-17
  • 2 回答
  • 0 關注
  • 173 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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