Go语言中的复合数据类型的对比分析
发表时间: 2024-05-10 16:54
reflect.DeepEqual 用于复合数据类型比较
package mainimport ("fmt""reflect")type tt struct { Code int}func main() { m1 := map[string]int{"a": 1, "b": 2, "c": 3} m2 := map[string]int{"a": 1, "c": 3, "b": 2} fmt.Println("m1 == nil", m1 == nil) fmt.Println("m2 != nil", m2 != nil) // fmt.Println("m1 == m2",m1 == m2) // map 数据类型 是不能直接用(==)比较的 fmt.Println("cmpMap(m1,m2) = ", cmpMap(m1, m2)) fmt.Println("reflect.DeepEqual(m1,m2) = ", reflect.DeepEqual(m1, m2)) fmt.Println() m3 := map[string]int{"a": 1, "b": 2, "c": 3, "d": 1} fmt.Println("cmpMap(m1,m3)=", cmpMap(m1, m3)) fmt.Println("reflect.DeepEqual(m1,m3) = ", reflect.DeepEqual(m1, m3))} // 编写效率高的函数func cmpMap(m1, m2 map[string]int) bool { for k1, v1 := range m1 { if v2, has := m2[k1]; has { if v1 != v2 { return false } } else { return false } } for k2, v2 := range m2 { if v1, has := m1[k2]; has { if v1 != v2 { return false } } else { return false } } return true}
注意: 1 golang 的复合数据类型是不能直接用(==)比较的;
2 由于reflect.DeepEqual需要经过反射操作, 效率比我们自己写的函数差; 尤其在不确定类型需要反射的时候,更是我们不可不用的强大工具(reflect.DeepEqual),
3 reflect.DeepEqual 除了用于 map 数据类型比较, 还可用于 slice, stuct 等数据类型的比较。