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
浙公网安备 33010602011771号