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.
Larangan membandingkan penunjuk fungsi untuk kesamaan didorong oleh sebab berikut:
Walaupun perbandingan fungsi penunjuk langsung tidak lagi dibenarkan, terdapat pendekatan alternatif untuk mencapai gelagat yang diingini:
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 }
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 }
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!