首頁 > 後端開發 > Golang > 如果方法參數實作了某個接口,那麼 Go 結構體是否也實作了該接口?

如果方法參數實作了某個接口,那麼 Go 結構體是否也實作了該接口?

Susan Sarandon
發布: 2024-12-09 02:46:08
原創
591 人瀏覽過

Does a Go Struct Implement an Interface If a Method Parameter Implements That Interface?

如果其方法參數實現了接口,則結構體不會實現接口

在Go 中,如果結構體實現了接口的所有方法,則它實現了該接口。但是,如果結構體方法有一個實現介面的參數,則該結構體將不會實作該介面。

package main

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) {
    c := new(C)
    return c, nil
}

func test(b B) {
}

func main() {
    d := new(D)
    test(d)
}
登入後複製

在上面的範例中,結構體 D 沒有實作介面 B,因為D 有一個實作介面 A 的參數。您收到的錯誤訊息是:

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)
登入後複製

要修復此錯誤,您需要更改 Connect 中參數的類型D 到 A 的方法。

type D struct {
}

func (d *D) Connect() (A, error) {
    c := new(C)
    return c, nil
}
登入後複製

現在,結構體 D 將實作介面 B,您將能夠以 D 值作為參數呼叫 test() 函數。

以上是如果方法參數實作了某個接口,那麼 Go 結構體是否也實作了該接口?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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