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

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

在結構中匿名/顯式嵌入接口

在結構中匿名/顯式嵌入接口

Go
忽然笑 2022-06-21 16:48:04
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與否。


查看完整回答
反對 回復 2022-06-21
  • 1 回答
  • 0 關注
  • 102 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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