Rumah > pembangunan bahagian belakang > Golang > Bagaimanakah Saya Boleh Membandingkan Penunjuk Fungsi untuk Kesaksamaan dalam Go?

Bagaimanakah Saya Boleh Membandingkan Penunjuk Fungsi untuk Kesaksamaan dalam Go?

Patricia Arquette
Lepaskan: 2024-12-28 13:40:12
asal
946 orang telah melayarinya

How Can I Compare Function Pointers for Equality in Go?

Kesamaan Penunjuk Fungsi dalam Go

Dalam Go, membandingkan dua penunjuk fungsi bukan nol untuk kesaksamaan menggunakan operator kesamaan penunjuk standard == telah menjadi tidak sah dalam versi terkini. Ini adalah penyimpangan daripada tingkah laku pra-Go1 di mana penunjuk fungsi boleh dibandingkan untuk identiti.

Rasional untuk Tidak Membenarkan Kesamaan Fungsi Penunjuk

Larangan membandingkan penunjuk fungsi untuk kesamaan didorong oleh sebab berikut:

  • Prestasi: Fungsi boleh dilaksanakan sebagai penutupan, yang tidak menangkap pembolehubah dari persekitarannya. Membenarkan perbandingan identiti memerlukan masa jalan untuk membuat penutupan baharu bagi setiap fungsi, menghasilkan overhed prestasi.
  • Kejelasan: Untuk mengelakkan percampuran kesaksamaan dan identiti, pengendali Go1 == dan != hanya membandingkan nilai untuk kesetaraan, bukan identiti. Ini memastikan pendekatan yang konsisten di seluruh bahasa.

Mencapai Kesamaan Fungsi Penunjuk

Walaupun perbandingan fungsi penunjuk langsung tidak lagi dibenarkan, terdapat pendekatan alternatif untuk mencapai gelagat yang diingini:

  • Tetapkan Pembolehubah Unik: Istiharkan berasingan pembolehubah untuk setiap fungsi dan bandingkan alamatnya:
package main

import "fmt"

func F1() {}
func F2() {}

var F1_ID = F1  // Create a *unique* variable for F1
var F2_ID = F2  // Create a *unique* variable for F2

func main() {
    f1 := &F1_ID  // Take the address of F1_ID
    f2 := &F2_ID  // Take the address of F2_ID

    fmt.Println(f1 == f1)  // Prints true
    fmt.Println(f1 == f2)  // Prints false
}
Salin selepas log masuk
  • Gunakan Refleksi: Pakej reflect menyediakan akses peringkat rendah kepada maklumat objek, termasuk penunjuk fungsi. Anda boleh menggunakannya untuk membandingkan identiti fungsi:
package main

import "fmt"
import "reflect"

func SomeFun() {}
func AnotherFun() {}

func main() {
    sf1 := reflect.ValueOf(SomeFun)
    sf2 := reflect.ValueOf(SomeFun)
    fmt.Println(sf1.Pointer() == sf2.Pointer())  // Prints true

    af1 := reflect.ValueOf(AnotherFun)
    fmt.Println(sf1.Pointer() == af1.Pointer())  // Prints false
}
Salin selepas log masuk

Nota: Penggunaan reflect bergantung pada tingkah laku yang tidak ditentukan. Ia tidak menjamin konsistensi merentas platform atau versi Go.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Membandingkan Penunjuk Fungsi untuk Kesaksamaan dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan