首頁 > 後端開發 > Golang > 如果方法的參數或回傳類型不完全匹配,為什麼 Go 結構體不實作介面?

如果方法的參數或回傳類型不完全匹配,為什麼 Go 結構體不實作介面?

Barbara Streisand
發布: 2024-12-15 11:18:11
原創
789 人瀏覽過

Why Doesn't a Go Struct Implement an Interface if a Method's Parameter or Return Type Doesn't Fully Match?

如果結構有一個參數實作介面的方法,則結構不會實作介面

在此範例中,我們有兩個介面A 和B,以及兩個結構體C和D,實現它們。當嘗試將 D 的實例傳遞給需要實作 B 的類型的函數時,會遇到錯誤。

理解介面實作

介面定義實作類型必須遵守的方法簽章。如果結構體具有與介面中的簽章相同的方法,則它實作了介面。

D 中 Connect 方法的問題

出現問題是因為 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 中的結構類型

Go 的結構類型允許結構體實作介面而無需明確聲明它們。如果結構中的方法與介面的簽章不匹配,這可能會導致錯誤。

介面參數類型的註解

將物件傳遞給需要介面的函數時,物件的類型必須實作該介面。對於 Equaler,Equal 的參數類型必須與介面類型匹配,而不僅僅是另一個也實作該介面的結構類型。

以上是如果方法的參數或回傳類型不完全匹配,為什麼 Go 結構體不實作介面?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板