Kata kunci Go seperti pergi dan tangguh jangkakan panggilan fungsi sebagai parameter. Adakah terdapat jenis khusus yang boleh memenuhi tujuan yang sama, membenarkan fungsi menerima panggilan fungsi sebagai argumen dan bukannya fungsi?
Malangnya, tiada jenis sedemikian dalam Pergi. Tingkah laku go dan defer dibina ke dalam spesifikasi bahasa dan dikuatkuasakan oleh pengkompil.
Sebaliknya, nilai fungsi boleh digunakan sebagai pembolehubah atau nilai. Ini boleh dipanggil kemudian seolah-olah ia adalah fungsi biasa.
<code class="go">func myFunc() { fmt.Println("hi") } func main() { var f func() f = myFunc f() // This calls the function value stored in f: myFunc in this example }</code>
Dalam sesetengah kes, adalah wajar untuk menyimpan parameter automatik untuk panggilan fungsi. Untuk jenis fungsi tertentu, ini boleh dicapai dengan memperkenalkan fungsi pembantu dengan tandatangan yang sama yang mengembalikan fungsi tanpa parameter. Penutupan ini memanggil fungsi asal dengan parameter yang disimpan.
Refleksi boleh digunakan untuk mengelakkan penyalinan parameter manual. Walau bagaimanapun, ia melibatkan penghantaran fungsi dan bukannya memanggilnya, memperlahankan proses.
Terdapat pengecualian apabila menggunakan kaedah. Nilai kaedah boleh menyimpan salinan penerima, membenarkan penjimatan parameter automatik untuk panggilan kaedah.
<code class="go">type myParams struct { format string i int s string } func (mp myParams) Call() { fmt.Printf(mp.format, mp.i, mp.s) } func main() { p := myParams{format: "%d %q\n", i: 1, s: "Hello, playground"} launch(p.Call) // p is saved here p.i, p.s = 2, "changed" time.Sleep(time.Second) }</code>
Nota: Tiada pendekatan ini memberikan padanan tepat untuk fungsi yang diingini. Jika parameter tertakluk kepada perubahan, penyalinan manual diperlukan sebelum menyerahkan fungsi kepada pembantu yang menyimpan parameter.
Atas ialah kandungan terperinci Bolehkah Anda Tentukan Jenis Panggilan Fungsi dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!