Rumah >pembangunan bahagian belakang >Golang >Adakah Go Struct Melaksanakan Antara Muka Jika Parameter Kaedah Melaksanakan Antara Muka Itu?

Adakah Go Struct Melaksanakan Antara Muka Jika Parameter Kaedah Melaksanakan Antara Muka Itu?

Susan Sarandon
Susan Sarandonasal
2024-12-09 02:46:08557semak imbas

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

Struct Tidak Melaksanakan Antara Muka Jika Parameter Kaedahnya Melaksanakan Antara Muka

Dalam Go, struct melaksanakan antara muka jika ia melaksanakan semua kaedah antara muka tersebut. Walau bagaimanapun, jika kaedah struct mempunyai parameter yang melaksanakan antara muka, struct tidak akan melaksanakan antara muka.

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)
}

Dalam contoh di atas, struct D tidak melaksanakan antara muka B kerana kaedah Connect bagi D mempunyai parameter yang melaksanakan antara muka A. Mesej ralat yang anda terima ialah:

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)

Untuk membetulkan ralat ini, anda perlu menukar jenis parameter dalam Connect kaedah D ke A.

type D struct {
}

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

Kini, struct D akan melaksanakan antara muka B, dan anda akan dapat memanggil fungsi test() dengan nilai D sebagai hujah.

Atas ialah kandungan terperinci Adakah Go Struct Melaksanakan Antara Muka Jika Parameter Kaedah Melaksanakan Antara Muka Itu?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn