在此範例中,我們有兩個介面A 和B,以及兩個結構體C和D,實現它們。當嘗試將 D 的實例傳遞給需要實作 B 的類型的函數時,會遇到錯誤。
介面定義實作類型必須遵守的方法簽章。如果結構體具有與介面中的簽章相同的方法,則它實作了介面。
出現問題是因為 D 中的 Connect 方法傳回一個指標到 C 而不是 A。根據介面 B,Connect 方法應該回傳 A。這種不匹配會阻止 D 完全實作介面 B。
要解決此問題,應變更D 中Connect 的回傳類型以符合介面定義:
type D struct { } func (d *D) Connect() (A, error) { // Returns A, not *C c := new(C) return c, nil }
Go 的結構類型允許結構體實作介面而無需明確聲明它們。如果結構中的方法與介面的簽章不匹配,這可能會導致錯誤。
將物件傳遞給需要介面的函數時,物件的類型必須實作該介面。對於 Equaler,Equal 的參數類型必須與介面類型匹配,而不僅僅是另一個也實作該介面的結構類型。
以上是如果方法的參數或回傳類型不完全匹配,為什麼 Go 結構體不實作介面?的詳細內容。更多資訊請關注PHP中文網其他相關文章!