Mencapai Gelagat Seperti Panggilan Fungsi dalam Go
Dalam Go, kata kunci seperti go dan defer mengharapkan fungsi diluluskan sebagai parameter. Walau bagaimanapun, terdapat had yang menghalang penghantaran panggilan fungsi sebenar.
Jawapan:
Malangnya, tiada jenis langsung yang membenarkan anda meniru panggilan fungsi sebagai argumen. go and defer ialah binaan sintaksis yang disokong oleh spesifikasi bahasa dan pengkompil menguatkuasakan tingkah laku ini.
Pendekatan Alternatif: Menggunakan Nilai Fungsi
Untuk memintas pengehadan ini, anda boleh menggunakan nilai fungsi. Nilai fungsi ialah pembolehubah atau nilai fungsi jenis. Anda boleh memanggil nilai fungsi kemudian atau pada bila-bila masa ia diperlukan.
<code class="go">func myFunc() { fmt.Println("hi") } func main() { var f func() f = myFunc f() // This calls the function value stored in f, which is myFunc in this case }</code>
Meniru Penjimatan Parameter Automatik
Dalam ulasan, anda menyebut keinginan untuk penjimatan parameter automatik . Begini cara anda boleh mencapai ini menggunakan fungsi pembantu yang menyediakan fungsi yang dibungkus dengan parameter yang disimpan:
<code class="go">func wrapPrintln(s string) func() { return func() { fmt.Println(s) } } func launch(f func()) { fmt.Println("Before launch") go func() { defer fmt.Println("After completion") f() }() } func main() { s := "Hello, playground" launch(wrapPrintln(s)) }</code>
Refleksi sebagai Pilihan
Refleksi ialah pendekatan lain untuk dikendalikan senario ini, tetapi ia melibatkan penghantaran fungsi sebagai antara muka dan menggunakan pantulan untuk memanggilnya. Pendekatan ini kurang cekap daripada menggunakan nilai fungsi tetapi membenarkan pengendalian fungsi dengan tandatangan yang berbeza-beza.
Kesimpulannya, walaupun tidak ada cara langsung untuk menghantar panggilan fungsi sebagai argumen, menggunakan nilai fungsi atau meniru penjimatan parameter melalui pembantu fungsi menyediakan penyelesaian untuk mencapai gelagat yang serupa.
Atas ialah kandungan terperinci Bolehkah anda Lulus Panggilan Fungsi sebagai Argumen dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!