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!