Rumah > Artikel > pembangunan bahagian belakang > Bagaimana Anda Boleh Membandingkan Fungsi dalam Go?
Dalam Go, fungsi ialah nilai kelas pertama, bermakna ia boleh ditugaskan kepada pembolehubah dan diserahkan sebagai argumen kepada fungsi lain. Walau bagaimanapun, tidak seperti jenis lain dalam Go, fungsi tidak dapat dibandingkan secara lalai. Ini boleh menyebabkan kekeliruan apabila cuba membandingkan fungsi dalam kod anda.
Seperti yang diperincikan dalam spesifikasi bahasa Go, nilai fungsi tidak boleh dibandingkan. Percubaan untuk membandingkan nilai fungsi menggunakan operator perbandingan standard seperti == atau != akan mengakibatkan ralat pengkompil.
<code class="go">if handler.Post != Undefined { // ... }</code>
Fungsi Tidak Ditakrifkan hadir dalam sampel kod ialah contoh fungsi yang tidak ditakrifkan dengan cara yang sama seperti fungsi biasa. Ia diisytiharkan sebagai fungsi yang mengambil hujah rentetan tunggal dan tidak mengembalikan apa-apa (func Undefined(foo string)). Undefined kemudiannya diberikan kepada medan Dapatkan struct Pengendali dalam fungsi init. Tugasan ini mencipta nilai fungsi untuk Undefined yang disimpan dalam medan Dapatkan.
Walaupun fungsi itu sendiri tidak dapat dibandingkan, adalah mungkin untuk membandingkan alamat nilai fungsi. Ini boleh dicapai dengan menggunakan fungsi fmt.Sprintf untuk mendapatkan perwakilan rentetan alamat fungsi dan kemudian membandingkan rentetan yang terhasil.
<code class="go">p1 := fmt.Sprintf("%v", Undefined) p2 := fmt.Sprintf("%v", hand.Get) fmt.Println("Expecting true:", p1 == p2)</code>
Kaedah ini secara berkesan menukar nilai fungsi kepada rentetan, yang kemudiannya boleh dibandingkan menggunakan operator ==.
Pendekatan alternatif untuk membandingkan alamat nilai fungsi ialah menggunakan kaedah reflect.Value.Pointer() . Kaedah ini mengembalikan alamat memori bagi nilai yang dicerminkan, yang kemudiannya boleh dibandingkan dengan alamat nilai fungsi yang lain.
<code class="go">u1 := reflect.ValueOf(Undefined).Pointer() u2 := reflect.ValueOf(hand.Get).Pointer() fmt.Println("Expecting true:", u1 == u2)</code>
Secara amnya tidak disyorkan untuk membandingkan fungsi alamat nilai. Sebaliknya, pemfaktoran semula kod anda untuk menghapuskan keperluan untuk perbandingan sedemikian adalah pendekatan yang lebih cekap dan boleh diselenggara. Pertimbangkan untuk menggunakan pendekatan yang berbeza, seperti menentukan antara muka atau menggunakan penegasan jenis, untuk mencapai tingkah laku yang anda inginkan.
Atas ialah kandungan terperinci Bagaimana Anda Boleh Membandingkan Fungsi dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!