Rumah >pembangunan bahagian belakang >Golang >Mengapa My Go Struct Tidak Melaksanakan Antara Muka?

Mengapa My Go Struct Tidak Melaksanakan Antara Muka?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-12-06 22:39:12414semak imbas

Why Doesn't My Go Struct Implement the Interface?

Pelaksanaan Antara Muka Memerlukan Tandatangan Kaedah Pemadanan

Dalam Go, antara muka menentukan struktur kaedah, termasuk nama, argumen dan nilai pulangannya. Apabila struct melaksanakan antara muka, ia mesti mematuhi tandatangan kaedah yang ditentukan oleh antara muka dengan ketat.

Pertimbangkan contoh ini apabila struct, D, dan kaedahnya, Connect, gagal melaksanakan antara muka B disebabkan oleh tidak padan dalam nilai pulangan:

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
}

Dalam kes ini, Connect dalam D mengembalikan penunjuk kepada C dan ralat, tetapi antara muka B menjangkakan Connect untuk mengembalikan pelaksanaan A dan ralat. Oleh itu, ralat menyatakan bahawa struct D tidak melaksanakan antara muka B, menonjolkan kepentingan penjajaran antara tandatangan kaedah.

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 menyelesaikan isu ini, pastikan tandatangan kaedah dalam pelaksanaan struct sepadan. pengisytiharan kaedah dalam antara muka. Dalam senario ini, kaedah Connect dalam D harus diubah suai untuk mematuhi antara muka B:

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

Sebaliknya, jika tandatangan kaedah dalam pelaksanaan struct berbeza daripada antara muka, struct tidak akan melaksanakan antara muka.

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

Dalam contoh ini, jenis hujah dalam Equal harus sepadan dengan jenis antara muka Equaler dan bukannya jenis lain, T, untuk dilaksanakan antara muka dengan betul.

Atas ialah kandungan terperinci Mengapa My Go Struct Tidak Melaksanakan Antara Muka?. 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