Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bolehkah Anda Tentukan Jenis Panggilan Fungsi dalam Go?

Bolehkah Anda Tentukan Jenis Panggilan Fungsi dalam Go?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-01 11:49:02526semak imbas

Can You Define a Type for Function Calls in Go?

Adakah mungkin untuk mentakrifkan jenis untuk panggilan fungsi dalam Go?

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?

Tiada Jenis Terus untuk Panggilan Fungsi

Malangnya, tiada jenis sedemikian dalam Pergi. Tingkah laku go dan defer dibina ke dalam spesifikasi bahasa dan dikuatkuasakan oleh pengkompil.

Menggunakan Nilai Fungsi sebagai Pembolehubah

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>

Meniru Penjimatan Parameter Automatik

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.

Menggunakan Refleksi untuk Melepasi Fungsi

Refleksi boleh digunakan untuk mengelakkan penyalinan parameter manual. Walau bagaimanapun, ia melibatkan penghantaran fungsi dan bukannya memanggilnya, memperlahankan proses.

Pengecualian Tunggal: Nilai Kaedah

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!

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