Bagaimanakah anda boleh mencipta sekeping fungsi dengan tandatangan berbeza dalam Go?
Sistem jenis Go adalah secara statik ditaip, yang bermaksud bahawa fungsi mesti mempunyai tandatangan tetap pada masa penyusunan. Walau bagaimanapun, ia boleh berguna untuk membuat kepingan fungsi yang boleh menerima hujah daripada jenis atau nombor yang berbeza.
Walaupun kod yang disediakan berfungsi, ia memerlukan penggunaan penyataan suis untuk mengendalikan setiap jenis tandatangan fungsi. Penyelesaian yang lebih ringkas dan fleksibel ialah menggunakan pantulan.
Berikut ialah contoh:
package main import ( "fmt" "reflect" ) type Executor func(...interface{}) func main() { functions := []Executor{ func(a, b int) { fmt.Println(a + b) }, func(s string) { fmt.Println(s) }, func() { fmt.Println("No arguments") }, } for _, f := range functions { numIn := reflect.TypeOf(f).NumIn() args := make([]reflect.Value, numIn) for i := 0; i < numIn; i++ { switch reflect.TypeOf(f).In(i).Kind() { case reflect.Int: args[i] = reflect.ValueOf(12) case reflect.String: args[i] = reflect.ValueOf("Hello") default: args[i] = reflect.Value{} } } f.Call(args) } }
Dalam penyelesaian ini, kami mencipta sekeping fungsi Pelaksana, yang merupakan fungsi yang menerima sebarang bilangan hujah. Pakej reflect digunakan untuk menentukan bilangan dan jenis argumen yang dijangkakan oleh setiap fungsi dan menjana pantulan yang sepadan. Potongan nilai.
Menggunakan pantulan membolehkan kami memanggil fungsi secara dinamik dengan tandatangan yang berbeza-beza tanpa memerlukan suis jenis atau antara muka{} hirisan.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mencipta Sekeping Fungsi dengan Tandatangan Berbeza dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!