Soalan:
Dalam Go, saya mempunyai struct dalam satu pakej yang melaksanakan antara muka. Dalam pakej bergantung yang lain, saya ingin mencipta pelaksanaan palsu bagi struct ini untuk tujuan ujian. Walau bagaimanapun, Go merungut tentang keselamatan jenis apabila saya cuba menetapkan fungsi mengembalikan struct yang melaksanakan antara muka kepada pembolehubah antara muka itu.
Seni Bina:
// Package expensive type myStruct struct{} func (m *myStruct) DoSomething() {...} func (m *myStruct) DoSomethingElse() {...} func CreateInstance() *myStruct {...} // Expensive to call // Package main type myInterface interface { DoSomething() } type structToConstruct struct { factoryFunction func() myInterface } func (s *structToConstruct) performAction() {...}
Ralat:
"tidak boleh menggunakan mahal.CreateInstance (taip func() *expensive.myStruct) sebagai taip func() myInterface dalam nilai medan"
Jawapan:
Isu timbul kerana fungsi CreateInstance mengembalikan nilai *myStruct , yang berbeza daripada func() jenis myInterface yang diperlukan oleh factoryFunction. Untuk menyelesaikan masalah ini:
// Package main type myInterface interface { DoSomething() } type myStruct struct{} func (m *myStruct) DoSomething() {...} func getInstance() myInterface { return &myStruct{} }
Dengan pengubahsuaian ini, getInstance kini mengembalikan jenis myInterface, membenarkannya untuk diberikan kepada factoryFunction.
Nota Tambahan:
wrapper := func() myInterface { return expensive.CreateInstance() }
Atas ialah kandungan terperinci Bagaimana untuk Menetapkan Fungsi Mengembalikan Struktur Melaksanakan Antara Muka dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!