Dalam contoh ini, kita mempunyai dua antara muka, A dan B, dan dua struct, C dan D, yang melaksanakannya. Apabila cuba menghantar tika D kepada fungsi yang mengharapkan jenis yang melaksanakan B, ralat akan berlaku.
Antaramuka mentakrifkan tandatangan kaedah yang mesti dipatuhi oleh jenis pelaksana. Sesuatu struct melaksanakan antara muka jika ia mempunyai kaedah dengan tandatangan yang sama seperti dalam antara muka.
Masalah timbul kerana kaedah Sambung dalam D mengembalikan penunjuk kepada C dan bukannya A. Menurut antara muka B, kaedah Sambung harus mengembalikan A. Ketakpadanan ini menghalang D daripada melaksanakan antara muka sepenuhnya B.
Untuk membetulkan isu, jenis pemulangan Connect dalam D hendaklah ditukar agar sepadan dengan definisi antara muka:
type D struct { } func (d *D) Connect() (A, error) { // Returns A, not *C c := new(C) return c, nil }
Penaipan struktur Go membolehkan struct melaksanakan antara muka tanpa mengisytiharkannya secara eksplisit. Ini boleh membawa kepada ralat jika kaedah dalam struct tidak sepadan dengan tandatangan antara muka.
Apabila menghantar objek kepada fungsi yang mengharapkan antara muka, jenis objek mesti melaksanakan antara muka itu. Dalam kes Equaler, jenis argumen Equal mesti sepadan dengan jenis antara muka, bukan sekadar jenis struct lain yang turut melaksanakan antara muka.
Atas ialah kandungan terperinci Mengapa Go Struct Tidak Melaksanakan Antara Muka jika Parameter Kaedah atau Jenis Pulangan Tidak Padan Sepenuhnya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!