問題的標題幾乎引用自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() 的簡寫。
- 1 回答
- 0 關注
- 242 瀏覽
添加回答
舉報
0/150
提交
取消