2 回答
TA贡献1859条经验 获得超6个赞
注意,平等和同一性之间是有区别的。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 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
}
- 2 回答
- 0 关注
- 285 浏览
添加回答
举报