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
Lepaskan: 2024-12-09 02:46:08
asal
559 orang telah melayarinya

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)
}
Salin selepas log masuk

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)
Salin selepas log masuk

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
}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan