在 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中文網其他相關文章!