栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

请注意,平等与身份之间是有区别的。Go1中的运算符

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

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


对于不允许的原因之一

==
,并
!=
在功能类型是性能。例如,以下关闭未使用其环境中的任何变量:

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 mainimport "fmt"func F1() {}func F2() {}var F1_ID = F1  // Create a *unique* variable for F1var F2_ID = F2  // Create a *unique* variable for F2func 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}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/369466.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号