Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana Anda Boleh Membandingkan Fungsi dalam Go?

Bagaimana Anda Boleh Membandingkan Fungsi dalam Go?

Linda Hamilton
Linda Hamiltonasal
2024-11-01 06:25:30134semak imbas

How Can You Compare Functions in Go?

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.

Isu Perbandingan

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 yang Tidak Ditakrifkan

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.

Membandingkan Alamat Nilai Fungsi

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 ==.

Kaedah Alternatif: reflect.Value.Pointer()

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>

Pemfaktoran Semula untuk Kejelasan

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!

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