Jenis Fungsi Go yang Mengembalikan Struktur Dalam Antara Muka
Dalam Go, adalah perkara biasa untuk menggunakan antara muka untuk mentakrifkan gelagat struct. Walau bagaimanapun, apabila bekerja dengan fungsi yang mengembalikan struktur yang melaksanakan antara muka, anda mungkin menghadapi ralat keselamatan jenis.
Memahami Isu
Mari kita periksa contoh kod yang anda berikan:
package expensive type myStruct struct { ... } // Struct with time-consuming methods func CreateInstance() *myStruct { ... } // Expensive factory function
package main import "expensive" type myInterface interface { DoSomething() } type structToConstruct struct { factoryFunction func() myInterface } func (s *structToConstruct) performAction() { instance := s.factoryFunction(); instance.DoSomething() }
Di sini, anda menentukan fungsi kilang CreateInstance yang mengembalikan *myStruct. Anda kemudian mencipta antara muka myInterface yang *myStruct laksanakan. Walau bagaimanapun, anda memperuntukkan fungsi kilang kepada medan dalam structToConstruct yang menjangkakan fungsi mengembalikan myInterface, menyebabkan ralat penyusunan.
Menyelesaikan Isu
Untuk menyelesaikannya, anda mempunyai dua pilihan:
wrapper := func() myInterface { return expensive.CreateInstance() } thing := structToConstruct{wrapper}
func CreateInstance() myInterface { return &myStruct{} }
Mengapa Pilihan 1 Berfungsi
Dalam Pilihan 1, fungsi pembungkus menukar hasil CreateInstance kepada myInterface sebelum memberikannya kepada factoryFunction. Ini memenuhi tandatangan jenis structToConstruct kerana fungsi pembalut sepadan dengan jenis fungsi yang dijangkakan.
Mengapa Pilihan 2 Memerlukan Cadangan 12754
Dalam Pilihan 2, jika anda cuba terus tetapkan CreateInstance kepada factoryFunction, Go akan mengadu kerana CreateInstance mengembalikan penunjuk berstruktur, bukan antara muka. Cadangan 12754 mencadangkan untuk melanjutkan bahasa untuk menyokong tugasan sedemikian, tetapi akhirnya ditolak.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengendalikan Antara Muka Pelaksana Struktur Pemulangan Fungsi Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!