在 Go 中,使用标准指针相等运算符 == 比较两个非零函数指针的相等性在最新版本中已变得无效。这与 Go1 之前的行为不同,在 Go1 之前,函数指针可以进行同一性比较。
禁止比较函数指针是否相等的动机是原因如下:
虽然不再允许直接比较函数的指针,但还有其他方法可以实现所需的行为:
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 }
注意:使用反射依赖于未定义的行为。它不保证跨平台或 Go 版本的一致性。
以上是在 Go 中如何比较函数指针是否相等?的详细内容。更多信息请关注PHP中文网其他相关文章!