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

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

如果 S 包含匿名字段 T,那么 S 的方法集是否包含接收者 *T 的提升方法?

如果 S 包含匿名字段 T,那么 S 的方法集是否包含接收者 *T 的提升方法?

Go
呼喚遠方 2021-07-08 10:01:56
問題的標題幾乎引用自golang 規范:給定一個結構類型 S 和一個名為 T 的類型,提升的方法包含在結構的方法集中,如下所示:如果 S 包含匿名字段 T,則 S 和 *S 的方法集都包含接收者 T 的提升方法。 *S 的方法集還包括接收者 *T 的提升方法。這是一個go Playground展示了該方法inc()的推廣。package mainimport (    "fmt")// just an int wrappertype integer struct {    i int}func (self *integer) inc() {    self.i++}type counter struct {    integer}func main() {    c := counter{}    c.inc()    fmt.Println(c)}
查看完整描述

1 回答

?
犯罪嫌疑人X

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

否 *T 的方法不會被提升。規范沒有明確允許它,所以它是不允許的。然而,這背后是有原因的。


有時您可能會在 T 上調用 *T 方法。但是,會采用隱式引用。*T 的方法不被視為 T 的方法集的一部分。


從Go 規范的調用部分:


如果 x 是可尋址的并且 &x 的方法集包含 m,則 xm() 是 (&x).m() 的簡寫


從Go 規范的地址運算符部分:


對于 T 類型的操作數 x,地址操作 &x 生成一個類型為 *T 的指針,指向 x。操作數必須是可尋址的,即變量、指針間接或切片索引操作;或可尋址結構操作數的字段選擇器;或可尋址數組的數組索引操作。作為可尋址性要求的一個例外,x 也可以是(可能帶括號的)復合文字。


如果 S 包含 *T,您甚至不需要獲取它的地址以便可以調用方法。如果 *S 包含 T,則您知道 T 是可尋址的,因為 T 是指針間接結構的字段選擇器。對于包含 T 的 S,無法保證這一點。


更新:為什么該代碼有效?


請記住,*S 包含*T 的方法集。另外,正如我之前引用的:


如果 x 是可尋址的并且 &x 的方法集包含 m,則 xm() 是 (&x).m() 的簡寫


把兩者放在一起,你就有了答案。Counter 是可尋址的,&counter 包含 *T 的方法集。因此,counter.Inc() 是 (&counter).Inc() 的簡寫。


查看完整回答
反對 回復 2021-07-12
  • 1 回答
  • 0 關注
  • 242 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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