当前位置: 首页 > 面试题库 >

如何在最新的Go周刊中比较两个函数的指针相等性?

公冶翰池
2023-03-14
问题内容

在Go中,是否可以比较两个非nil函数指针以测试是否相等?我的平等标准是指针平等。如果不是,是否有任何特定的原因为什么不允许指针相等?

到目前为止,如果我尝试以简单的方式执行此操作:

package main

import "fmt"

func SomeFun() {
}

func main() {
    fmt.Println(SomeFun == SomeFun)
}

我懂了

./func-pointers.go:12: invalid operation: SomeFun == SomeFun (func can only be compared to nil)

据我了解,这种行为是最近才引入的。

我已经使用反射包找到了答案;但是Atom在下面暗示这实际上会产生不确定的行为。有关更多信息和可能的替代解决方案,请参见Atom的帖子。

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())

    af1 := reflect.ValueOf(AnotherFun)
    fmt.Println(sf1.Pointer() == af1.Pointer())
}

输出:

true
false

问题答案:

请注意,平等与身份之间是有区别的。Go1中的运算符==和和!=正在比较等效值(比较通道时除外),而不是标识。由于这些运算符试图
将平等性和同一性混为一谈,因此Go1在这方面比Go1之前的一致性更高。

函数相等与函数身份不同。

对于不允许的原因之一==,并!=在功能类型是html" target="_blank">性能。例如,以下关闭未使用其环境中的任何变量:

f := func(){fmt.Println("foo")}

不允许进行功能比较,使编译器可以为闭包生成单个实现,而不是要求运行时创建新的闭包(在运行时)。因此,从性能的角度来看,不允许进行功能比较的决定是一个不错的决定。

关于使用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
}

依赖 未定义的行为
。无法保证程序将打印什么。编译器可能会决定将其合并SomeFun并合并AnotherFun为单个实现,在这种情况下,第二个print语句将为print
true。实际上,绝对不能保证第一个print语句会打印true(在其他Go1编译器和运行时下,它可能会打印false)。

原始问题的正确答案是:

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
}


 类似资料:
  • 问题内容: 在java中如何比较两个对象是否相等?何时使用equals和hashcode? 问题答案: 理论(针对语言律师和数学倾向者): (javadoc)必须定义一个等价关系(它必须是自反的,对称的和可传递的)。另外,它必须是一致的(如果未修改对象,则它必须保持返回相同的值)。此外,必须始终返回false。 (javadoc)也必须是一致的(如果未根据修改对象equals(),则它必须保持返回

  • 比较两个NumPy数组是否相等的最简单方法是什么(其中相等定义为:A=B iff,用于所有索引i:

  • 我想比较这两个函数的值。不幸的是,我试图使,但我一直得到。 我想检查如果。这就是我上面完整的代码。

  • 问题内容: 给出两个列表: 我怎么写这样的: 问题答案: 你想要这个吗: 注意:当List处于无序状态时(例如,( 和中的 通知顺序))无用 请参阅此问题以获取更多参考:如何在python中比较列表/集合的列表? 编辑 :感谢@dr jimbob 如果要在排序后进行比较,可以使用。 但是再说一遍,如果那是因为,与众不同( 不是深度排序 ) 为此,您必须使用链接答案中的技术。由于我也在学习Pytho

  • 问题内容: 如何比较javascript中的2个函数?我不是在谈论内部参考。说 可以比较和吗? 问题答案:

  • 我做了这个扩展方法来检查一个类型是否实现了一个接口。要使其正常工作,它需要比较两种类型。然而,这种比较似乎并不现实: 这是我比较失败的情况: 正如注释中提到的,如果我比较类型名,那么它总是按照预期工作。我想知道这是怎么回事。