概要
在struct中,使用函数类型作为成员时,我们把相同的函数赋值给这个成员,使用reflect.DeepEqual得到两个变量的比较结果是false,这是为什么呢?
上源码
func DeepEqual(x, y interface{}) bool {
if x == nil || y == nil {
return x == y
}
v1 := ValueOf(x)
v2 := ValueOf(y)
if v1.Type() != v2.Type() {
return false
}
return deepValueEqual(v1, v2, make(map[visit]bool))
}
对于同一个包中的相同函数,他们的Type是相同的: main.Func main.Func
func deepValueEqual(v1, v2 Value, visited map[visit]bool) bool {
// ...
switch v1.Kind() {
case Func:
if v1.IsNil() && v2.IsNil() {
return true
}
// Can't do better than this:
return false
}
}
我们发现,只有当2个函数的Type相同,但是都为Nil时,才会相等。 除此之外,Go无法判断两个函数是否是DeepEqual。 为什么? 可以试试把一个相同的函数定义在不同的包内,他们的Type是不同的。即使是一个包中的相同函数,他们的Value仅仅也只是个指针,无法得到更多信息了。