传统上,比较 Go 中的两个非 nil 函数指针涉及使用 == 或 != 运算符。然而,根据最近的变化,这种方法现在会导致错误。
函数指针相等比较的消除源于相等与同一的概念。在 Go 中,== 和 != 运算符评估值的等价性,而不是同一性。这种区别旨在防止这些概念之间的混淆。
此外,函数的比较也会影响性能。例如,不引用外部变量的匿名闭包应该由编译器优化为单个实现。比较函数指针会阻碍这种优化,需要在运行时动态创建新的闭包。
虽然可以使用 Reflect 包确定函数标识,但需要注意的是这种方法会带来未定义的行为。这种比较的结果是不可靠的,因为编译器可能决定将多个函数折叠成一个实现。
为了有效地比较函数指针,可以采用以下方法:
package main import "fmt" func F1() {} func F2() {} var F1_ID = F1 // Assign a unique variable to F1 var F2_ID = F2 // Assign a unique variable to 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中文网其他相关文章!