首页 > 后端开发 > Golang > 在 Go 中如何比较函数指针是否相等?

在 Go 中如何比较函数指针是否相等?

Patricia Arquette
发布: 2024-12-28 13:40:12
原创
984 人浏览过

How Can I Compare Function Pointers for Equality in Go?

Go 中的函数指针相等

在 Go 中,使用标准指针相等运算符 == 比较两个非零函数指针的相等性在最新版本中已变得无效。这与 Go1 之前的行为不同,在 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
}
登录后复制
  • 使用反射:reflect包提供对对象信息的低级访问,包括函数指针。您可以使用它来比较函数身份:
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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板