Jenis Fungsi Go Memulangkan Struktur untuk Pelaksanaan Antara Muka
Pertimbangkan senario di mana anda mempunyai struktur dalam pakej dengan kaedah dan kilang yang memakan masa fungsi. Untuk menguji struct ini dengan berkesan, adalah wajar untuk menggunakan kedua-dua fungsi kilang palsu dan struct palsu sebaik sahaja dibuat.
Kod berikut menunjukkan ini:
package expensive import "fmt" type myStruct struct{} func (m *myStruct) DoSomething() { fmt.Println("In Do something") } func (m *myStruct) DoSomethingElse() { fmt.Println("In Do something else") } // CreateInstance is expensive to call func CreateInstance() *myStruct { return &myStruct{} }
Dalam pakej bergantung, kami antara muka seperti ini:
package main import "play/expensive" func main() { thing := structToConstruct{expensive.CreateInstance} thing.performAction() } type myInterface interface { DoSomething() } type structToConstruct struct { factoryFunction func() myInterface } func (s *structToConstruct) performAction() { instance := s.factoryFunction() instance.DoSomething() }
Walau bagaimanapun, kod ini menimbulkan ralat:
.\main.go:6: cannot use expensive.CreateInstance (type func() *expensive.myStruct) as type func() myInterface in field value
Walaupun *mahal.myStruct melaksanakan myInterface, Go mengadu tentang keselamatan jenis.
Menurut pasukan Go, tingkah laku ini adalah disengajakan:
Having a function type in a struct field that returns the underlying concrete type would violate a core principle of interfaces. That principle is that the concrete type can be replaced by any other implementation of the interface type. If the receiver type of a function were the underlying concrete type, the behavior of the function would change if called via an interface.
Penyelesaian adalah dengan membalut fungsi kilang:
wrapper := func() myInterface { return expensive.CreateInstance() } thing := structToConstruct{wrapper}
Pembungkus ini mematuhi myInterface dan kod disusun.
Atas ialah kandungan terperinci Bagaimanakah Struktur Pemulangan Jenis Fungsi Go Boleh Digunakan untuk Pelaksanaan Antara Muka?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!