首頁 >後端開發 >Golang >為什麼我的 Go struct 沒有實作介面?

為什麼我的 Go struct 沒有實作介面?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-12-06 22:39:12414瀏覽

Why Doesn't My Go Struct Implement the Interface?

介面實作需要符合方法簽章

在 Go 中,介面規定了方法的結構,包括其名稱、參數和傳回值。當結構體實作介面時,它必須嚴格遵守介面指定的方法簽章。

考慮這個範例,其中結構體D 及其方法Connect 由於以下原因無法實現介面B返回值不符:

type A interface {
    Close()
}

type B interface {
    Connect() (A, error)
}

type C struct {
}

func (c *C) Close() {

}

type D struct {
}

func (d *D) Connect() (*C, error) { // Mismatched function signature compared to interface B's Connect method
    c := new(C)
    return c, nil
}

在這種情況下,D 中的Connect 返回一個指向C 的指標和一個錯誤,但介面B 期望Connect 回傳A 的實現,並且一個錯誤。因此,錯誤表示結構體 D 沒有實作介面 B,突顯了方法簽章之間對齊的重要性。

cannot use d (type *D) as type B in argument to test:
*D does not implement B (wrong type for Connect method)
have Connect() (*C, error)
want Connect() (A, error)

要解決此問題,請確保結構體實作中的方法簽章符合介面中的方法宣告。在這種情況下,D 中的Connect 方法應修改以符合B 介面:

func (d *D) Connect() (A, error) {
    c := new(C)
    return c, nil
}

相反,如果結構體實作中的方法簽章與介面不同,則該結構體將不會實作介面。

type Equaler interface {
    Equal(Equaler) bool
}

type T int
func (t T) Equal(u T) bool { // Argument type mismatch
    return t == u
} // does not satisfy Equaler

在此範例中,Equal 中的參數類型應與介面類型 Equaler 匹配,而不是不同的類型 T,以實現該介面正確。

以上是為什麼我的 Go struct 沒有實作介面?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn