Quiero verificar si dos estructuras, cortes y mapas son iguales.
Pero me encuentro con problemas con el siguiente código. Vea mis comentarios en las líneas relevantes.
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)
}
go
go-reflect
leiyonglin
fuente
fuente
Respuestas:
Puede usar reflect.DeepEqual , o puede implementar su propia función (cuyo rendimiento sería mejor que usar la reflexión):
http://play.golang.org/p/CPdfsYGNy_
fuente
reflect.DeepEqual
a menudo se usa incorrectamente para comparar dos estructuras similares, como en su pregunta.cmp.Equal
es una mejor herramienta para comparar estructuras.Para ver por qué la reflexión no es aconsejable, veamos la documentación :
Si comparamos dos
time.Time
valores de la misma hora UTC,t1 == t2
será falso si su zona horaria de metadatos es diferente.go-cmp
busca elEqual()
método y lo usa para comparar correctamente los tiempos.Ejemplo:
fuente
go-cmp
y noreflect
.Así es como desarrollarías tu propia función http://play.golang.org/p/Qgw7XuLNhb
fuente
if len(a.Z) != len(b.Z) || len(a.M) != len(b.M) { return false }
, porque uno de ellos podría tener campos adicionales.Desde julio de 2017 puede usar
cmp.Equal
concmpopts.IgnoreFields
opción.fuente
Si los está comparando en la prueba unitaria , una alternativa útil es la función EqualValues en testify .
fuente