Golang Equal

解决问题:

在DeepEqual的基础之上进行改进,解决==相等但DeepEqual不等的情况。例如

if  1.0 == 1 {
	fmt.Println("i will be printed")
}

if reflect.DeepEqual(1.0, 1) {
	fmt.Println("i will not be printed")
}

其原因在于:

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), 0)
}

在golang DeepEqual函数中,两个interface{}比较的前提是v1.Type() == v2.Type()。但在实际的应用中,经常会对两个接口进行比较,在比较的过程中,出现1.0 != 1的情况,显然是不合理的。Golang Equal就是来解决这个问题的。

  • 对不同的数值类型(int int8 int16 int32 int64 uint uint8 uint16 uint32 uint64 float32 float64),只要值相等,无论类型是否相等,均为相等。如以下变量之间的相互比较,使用Equal(x, y)均为true。
    var i int = 1
    var i8 int8 = 1
    var i16 int16 = 1
    var i32 int32 = 1
    var i64 int64 = 1
    
    var ui uint = 1
    var ui8 uint8 = 1
    var ui16 uint16 = 1
    var ui32 uint32 = 1
    var ui64 uint64 = 1
    
    var f32 float32 = 1.000
    var f64 float64 = 1.000
    

参考实现:goconvey

goconvey : https://github.com/smartystreets/goconvey

设计实现

e : expected
c : actual

expected \ actual signed integer unsigned integer float
signed integer 将e、c转为int64 将e、c转为uint64 同float32或float64\signed integer
unsigned integer 将e、c转为uint64 将e、c转为uint64 同float32或float64\unsigned integer
float32 将c转为float32 将c转为float32 将c转为float32
float64 将c转为float64 将c转为float64 将c转为float64

代码

golangEqual : https://github.com/SwanSpouse/GolangEqual/tree/master

posted on 2017-05-04 11:15  逄美丽守护神  阅读(1259)  评论(0)    收藏  举报

导航