Go的函数类型DeepEqual为什么是false

201 阅读1分钟

概要

在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仅仅也只是个指针,无法得到更多信息了。