Rumah >pembangunan bahagian belakang >Golang >Bolehkah fungsi `decorator()` Go mengendalikan fungsi dengan jenis pulangan tertentu tanpa generik?

Bolehkah fungsi `decorator()` Go mengendalikan fungsi dengan jenis pulangan tertentu tanpa generik?

DDD
DDDasal
2024-12-26 19:47:31576semak imbas

Can Go's `decorator()` function handle functions with specific return types without generics?

Melalukan Fungsi Arbitrari kepada Parameter dalam Go

Dalam Go, fungsi hantaran sebagai parameter membolehkan fleksibiliti dan penggunaan semula kod yang lebih besar. Walau bagaimanapun, terdapat had apabila cuba menghantar fungsi dengan tandatangan berbeza sebagai parameter.

Pertimbangkan senario di mana anda ingin mencipta fungsi penghias() yang mampu membungkus sebarang fungsi sedia ada. Untuk fungsi dengan parameter tunggal dan nilai pulangan (cth., funcA), ini adalah mudah menggunakan antara muka func(antara muka{}){} sebagai jenis parameter.

Soalan: Bolehkah fungsi seperti funcB, yang menerima dan mengembalikan jenis tertentu (dalam kes ini, rentetan), ditukar kepada jenis antara muka func(antara muka{}){} untuk keserasian dengan decorator()?

Jawapan: Malangnya, ini tidak boleh dilakukan dalam Go tanpa menggunakan generik. Sebabnya terletak pada perbezaan asas dalam mekanik lulus parameter antara fungsi.

Sebagai contoh, fungsi yang menerima struct sebagai argumen menerima setiap ahlinya secara individu. Sebaliknya, fungsi yang menerima antara muka{} yang mengandungi struct itu akan menerima dua nilai: deskriptor untuk jenis struct dan penunjuk kepada struct.

Oleh itu, untuk mencapai kelakuan yang diingini, fungsi penyesuai akan diperlukan untuk merapatkan jurang antara tandatangan fungsi asal dan jenis antara muka{} func(antara muka{}) yang dijangkakan.

Atas ialah kandungan terperinci Bolehkah fungsi `decorator()` Go mengendalikan fungsi dengan jenis pulangan tertentu tanpa generik?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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