我想检查两个结构、切片和映射是否相等。
但是我遇到了以下代码的问题。请参阅我在相关行的评论。
package main import ( "fmt" "reflect" ) type T struct { X int Y string Z []int M map[string]int } func main() { t1 := T{ X: 1, Y: "lei", Z: []int{1, 2, 3}, M: map[string]int{ "a": 1, "b": 2, }, } t2 := T{ X: 1, Y: "lei", Z: []int{1, 2, 3}, M: map[string]int{ "a": 1, "b": 2, }, } fmt.Println(t2 == t1) //error - invalid operation: t2 == t1 (struct containing []int cannot be compared) fmt.Println(reflect.ValueOf(t2) == reflect.ValueOf(t1)) //false fmt.Println(reflect.TypeOf(t2) == reflect.TypeOf(t1)) //true //Update: slice or map a1 := []int{1, 2, 3, 4} a2 := []int{1, 2, 3, 4} fmt.Println(a1 == a2) //invalid operation: a1 == a2 (slice can only be compared to nil) m1 := map[string]int{ "a": 1, "b": 2, } m2 := map[string]int{ "a": 1, "b": 2, } fmt.Println(m1 == m2) // m1 == m2 (map can only be compared to nil) }
http://play.golang.org/p/AZIzW2WunI
您可以使用reflect.DeepEqual,或者您可以实现自己的功能(性能方面会比使用反射更好):
http://play.golang.org/p/CPdfsYGNy_
m1 := map[string]int{ "a":1, "b":2, } m2 := map[string]int{ "a":1, "b":2, } fmt.Println(reflect.DeepEqual(m1, m2))