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 等数据类型的比较。