Meluluskan Fungsi Arbitrari sebagai Parameter dalam Go
Fungsi lulus sebagai parameter dalam Go membolehkan penciptaan dinamik dan pelaksanaan kod. Walau bagaimanapun, terdapat pengehadan kepada jenis fungsi yang boleh dilalui.
Pertimbangkan senario berikut: kami ingin mencipta fungsi penghias yang boleh membalut sebarang fungsi yang menerima satu parameter dan mengembalikan satu nilai. Untuk mengendalikan fungsi menerima atau mengembalikan jenis antara muka{}, kita boleh mentakrifkan fungsi penghias dengan antara muka func(antara muka{}){} sebagai hujahnya.
Walau bagaimanapun, ia tidak mungkin untuk menukar fungsi jenis func (rentetan) rentetan kepada jenis antara muka func(antara muka{}){} secara tersirat. Ini kerana parameter dan mekanik jenis pemulangan berbeza antara fungsi. Melepasi argumen{} antara muka tidak menjamin keserasian dengan semua jenis.
Sebagai contoh, fungsi yang menerima struct sebagai argumen akan menerima ahli individu struct tersebut. Sebaliknya, fungsi yang menerima antara muka{} yang mengandungi struct itu akan menerima dua perkataan: satu untuk jenis dan satu untuk penuding kepada struct.
Penyelesaian
Tanpa generik, tiada cara langsung untuk mencapai fungsi ini. Walau bagaimanapun, kita boleh menggunakan fungsi penyesuai sebagai penyelesaian:
// Adapter function for func(string) string to func(interface{}) interface{} func adapter(inner func(string) string) func(interface{}) interface{} { return func(arg interface{}) interface{} { // Convert the interface{} arg to a string argString := arg.(string) // Call the inner function with the converted string result := inner(argString) // Return the result return result } }
Kini, kita boleh menghantar funcB ke dalam penghias menggunakan fungsi penyesuai:
fmt.Println(decorate(adapter(funcB), "(This is B's argument)"))
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Melepasi Fungsi Arbitrari sebagai Parameter dalam Go, Mempertimbangkan Had Keserasian Jenis?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!