Soalan:
Adakah mungkin untuk mencipta fungsi secara dinamik yang melaksanakan antara muka yang telah ditetapkan dalam Pergi guna refleksi?
Jawapan:
Dalam versi asal Go, tidak mungkin untuk mencipta jenis baharu dengan kaedah yang dilampirkan melalui refleksi. Walau bagaimanapun, dengan keluaran Go 1.5, fungsi reflect.FuncOf dan reflect.MakeFunc telah diperkenalkan untuk menangani keperluan yang tepat ini.
Fungsi ini membolehkan anda menentukan jenis fungsi dan mencipta nilai fungsi yang mematuhinya. type:
funcType := reflect.FuncOf([]reflect.Type{reflect.TypeOf("")}, []reflect.Type{reflect.TypeOf("")}) fn := reflect.MakeFunc(funcType, func(args []reflect.Value) []reflect.Value { ... })
Argumen pertama untuk mencerminkan.MakeFunc ialah jenis fungsi, manakala argumen kedua ialah nilai fungsi yang melaksanakan jenis itu.
Dalam konteks contoh yang diberikan:
type MyService interface { Login(username, password string) (sessionId int, err error) HelloWorld(sessionId int) (hi string, err error) }
Anda boleh mencipta fungsi yang melaksanakan antara muka ini menggunakan pantulan seperti berikut:
fn := reflect.MakeFunc(reflect.TypeOf((*MyService)(nil)).Elem(), func(args []reflect.Value) []reflect.Value { switch args[0].String() { case "Login": return []reflect.Value{ reflect.ValueOf(1), reflect.ValueOf(nil), } case "HelloWorld": return []reflect.Value{ reflect.ValueOf("Hello, world!"), reflect.ValueOf(nil), } } return []reflect.Value{ reflect.Value{}, reflect.ValueOf(errors.New("Method not found")), } })
Pelaksanaan ini menggunakan pernyataan suis untuk menentukan kaedah antara muka yang hendak dipanggil berdasarkan hujah pertama. Ia kemudian mengembalikan nilai yang sesuai untuk argumen output.
Atas ialah kandungan terperinci Bolehkah Refleksi Go Mencipta Fungsi Melaksanakan Antara Muka Dipratentukan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!