Rumah > pembangunan bahagian belakang > Golang > Bagaimanakah Saya Boleh Melepasi Fungsi Arbitrari sebagai Parameter dalam Go, Mempertimbangkan Had Keserasian Jenis?

Bagaimanakah Saya Boleh Melepasi Fungsi Arbitrari sebagai Parameter dalam Go, Mempertimbangkan Had Keserasian Jenis?

Linda Hamilton
Lepaskan: 2025-01-03 09:16:39
asal
427 orang telah melayarinya

How Can I Pass an Arbitrary Function as a Parameter in Go, Considering Type Compatibility Limitations?

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
    }
}
Salin selepas log masuk

Kini, kita boleh menghantar funcB ke dalam penghias menggunakan fungsi penyesuai:

fmt.Println(decorate(adapter(funcB), "(This is B's argument)"))
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan