Jenis Fungsi Go Mengembalikan Struktur Tidak Serasi dengan Antara Muka
Soalan:
In Go, kenapa adakah fungsi mengembalikan struct yang melaksanakan antara muka tidak memenuhi keperluan jenis medan yang menjangkakan fungsi mengembalikan antara muka itu?
Jawapan:
Masalahnya terletak pada hakikat bahawa jenis fungsi Go yang mengembalikan struct tidak boleh ditukar ganti dengan jenis fungsi yang mengembalikan antara muka, walaupun struct melaksanakan antara muka. Apabila mengisytiharkan tandatangan jenis untuk fungsi dalam struktur, jenis pulangan tertentu mesti sepadan dengan jenis yang diisytiharkan. Mengubah suai fungsi kilang untuk mengembalikan jenis antara muka secara langsung menyelesaikan isu.
Contoh:
package main import "fmt" func main() { thing := structToConstruct{getInstance} thing.performAction() } type myInterface interface { doSomething() } type structToConstruct struct { factoryFunction func() myInterface } func (s *structToConstruct) performAction() { instance := s.factoryFunction() instance.doSomething() } func getInstance() myInterface { return &myStruct{} } type myStruct struct{} func (m *myStruct) doSomething() { fmt.Println("doing something") }
Dalam contoh ini, fungsi kilang diubah suai untuk mengembalikan tika myInterface, yang memenuhi keperluan jenis untuk structToConstruct.
Penjelasan:
Apabila mengisytiharkan jenis structToConstruct, kami menyatakan bahawa factoryFunction sepatutnya menjadi fungsi yang mengembalikan myInterface. Walau bagaimanapun, fungsi mahal.CreateInstance mengembalikan nilai *myStruct, yang tidak boleh diserahkan terus kepada myInterface. Ini kerana antara muka Go menyediakan keselamatan jenis dan fungsi yang mengembalikan jenis struct tertentu (cth., *myStruct) tidak boleh ditukar secara automatik kepada fungsi yang mengembalikan jenis antara muka yang ia laksanakan.
Untuk menggunakan *myStruct nilai dengan myInterface, kita mesti menukarnya secara eksplisit menggunakan penegasan jenis atau dengan mencipta fungsi penyesuai yang membungkus penukaran:
func wrapper() myInterface { return expensive.CreateInstance() } thing := structToConstruct{wrapper}
Atas ialah kandungan terperinci Mengapa Fungsi Go Tidak Mengembalikan Struktur Melaksanakan Antara Muka Memenuhi Medan Fungsi Mengembalikan Antara Muka?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!