利用reflect.DeepEqual
函数判断是否相等
package main
import (
"fmt"
"reflect"
)
func slice_demo() {
str1 := []string{"123", "hwt"}
str2 := []string{"123", "hwt"}
str3 := []string{"hwt", "123"}
ok := reflect.DeepEqual(str1, str2)
if ok {
fmt.Println("str1 == str2!")
} else {
fmt.Println("str1 != str2!")
}
//会从data序号依次比较,所以两个slice数值和位置需要一一对应
ok = reflect.DeepEqual(str1, str3)
if ok {
fmt.Println("str1 == str3!")
} else {
fmt.Println("str1 != str3!")
}
}
func map_demo() {
mp1 := map[int]int{1: 10, 2: 20}
mp2 := map[int]int{1: 10, 2: 20}
mp3 := map[int]int{2: 20, 1: 10}
ok := reflect.DeepEqual(mp1, mp2)
if ok {
fmt.Println("mp1 == mp2!")
} else {
fmt.Println("mp1 != mp2!")
}
//只比较两个哈希表的 key/value是否等量相等
ok = reflect.DeepEqual(mp1, mp3)
if ok {
fmt.Println("mp1 == mp3!")
} else {
fmt.Println("mp1 != mp3!")
}
}
func main() {
slice_demo()
map_demo()
}
测试结果如下:
reflect.DeepEqual
函数中,slice的比较逻辑如下,可以发现是按照序号来依次比较的,所以str1和str3虽然有一样的值,但并不相等
case Slice:
if v1.IsNil() != v2.IsNil() {
return false
}
if v1.Len() != v2.Len() {
return false
}
if v1.Pointer() == v2.Pointer() {
return true
}
for i := 0; i < v1.Len(); i++ {
if !deepValueEqual(v1.Index(i), v2.Index(i), visited) {
return false
}
}
return true
reflect.DeepEqual
函数中,map的比较逻辑如下,可以发现就是找到每个key值,然后比较两个map[key]的value值是否相等,所以mp1和mp3相等
case Map:
if v1.IsNil() != v2.IsNil() {
return false
}
if v1.Len() != v2.Len() {
return false
}
if v1.Pointer() == v2.Pointer() {
return true
}
for _, k := range v1.MapKeys() {
val1 := v1.MapIndex(k)
val2 := v2.MapIndex(k)
if !val1.IsValid() || !val2.IsValid() || !deepValueEqual(val1, val2, visited) {
return false
}
}
return true