type A interface { f()}type B struct { A}type C struct { Imp A}func main() { b := B{} c := C{} //b can be directly assigned to the A interface, but c prompts that it cannot be assigned var ab A = b //Cannot use 'c' (type C) as type A in assignment Type does not implement 'A' as some methods are missing: f() var ac A = c}B結構和C結構有什么區別?在 Go 表中使用類型聲明但沒有顯式字段名稱的字段稱為嵌入字段。嵌入字段必須指定為類型名稱 T 或指向非接口類型名稱 *T 的指針,并且 T 本身可能不是指針類型。非限定類型名稱充當字段名稱。
1 回答

慕尼黑8549860
TA貢獻1818條經驗 獲得超11個贊
如果您繼續閱讀規范的同一部分,您會注意到以下內容:
給定一個結構類型 S 和一個定義類型 T,提升的方法包含在結構的方法集中,如下所示:
如果 S 包含嵌入字段 T,則 S 和 *S 的方法集都包含帶有接收者 T 的提升方法。*S 的方法集還包括帶有接收者 *T 的提升方法。
如果 S 包含嵌入字段 *T,則 S 和 *S 的方法集都包含帶有接收器 T 或 *T 的提升方法。
您的結構B
沒有明確定義的方法,但B
的方法集隱含地包括來自嵌入字段的提升方法。在這種情況下,嵌入字段是一個帶有方法的接口f()
。您可以使用任何滿足該接口的對象,并且它的f()
方法將自動成為為B
.
另一方面,您的C
結構有一個命名字段。上的方法Imp
不會自動添加到C
方法集中。相反,要從 訪問f()
方法Imp
,您需要專門調用C.Imp.f()
.
最后:您使用接口作為(嵌入或不嵌入)字段這一事實并不重要,它很容易成為另一個具有f()
方法的結構。重要的部分是是否f()
成為父結構的方法集的一部分,這將允許它實現A
與否。
- 1 回答
- 0 關注
- 102 瀏覽
添加回答
舉報
0/150
提交
取消