Go 中的函数指针相等
在 Go 中,不允许使用 == 或 != 运算符来比较函数指针的相等性不为零。此行为可以防止相等和恒等比较的混合。
函数相等与函数恒等不同。应该使用同一性比较来确定两个函数是否是同一个函数,而应该使用相等性比较来确定两个函数是否等价。
使用reflect包来比较函数同一性,如Atom示例所示,被视为未定义的行为。编译器可能会通过合并函数的实现来优化函数,从而使比较变得不可靠。
要正确比较函数指针的同一性,您可以为每个函数创建唯一的变量,然后比较这些变量的地址。这种方法可确保您比较同一函数的函数指针,而不管优化如何。
以下是如何比较函数指针同一性的示例:
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 // Compare pointers fmt.Println(f1 == f1) // Prints true fmt.Println(f1 == f2) // Prints false }
以上是如何在 Go 中安全地比较函数指针的同一性?的详细内容。更多信息请关注PHP中文网其他相关文章!