Je veux vérifier si deux structures, tranches et cartes sont égales.
Mais je rencontre des problèmes avec le code suivant. Voir mes commentaires aux lignes pertinentes.
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
la source
la source
Réponses:
Vous pouvez utiliser reflect.DeepEqual , ou vous pouvez implémenter votre propre fonction (qui en termes de performances serait meilleure que d'utiliser la réflexion):
http://play.golang.org/p/CPdfsYGNy_
la source
reflect.DeepEqual
est souvent mal utilisé pour comparer deux structures similaires, comme dans votre question.cmp.Equal
est un meilleur outil pour comparer les structures.Pour voir pourquoi la réflexion n'est pas judicieuse, regardons la documentation :
Si nous comparons deux
time.Time
valeurs de la même heure UTC,t1 == t2
sera faux si leur fuseau horaire de métadonnées est différent.go-cmp
recherche laEqual()
méthode et l'utilise pour comparer correctement les temps.Exemple:
la source
go-cmp
et nonreflect
.Voici comment lancer votre propre fonction http://play.golang.org/p/Qgw7XuLNhb
la source
if len(a.Z) != len(b.Z) || len(a.M) != len(b.M) { return false }
, car l'un d'eux pourrait avoir des champs supplémentaires.Depuis juillet 2017, vous pouvez utiliser
cmp.Equal
aveccmpopts.IgnoreFields
option.la source
Si vous les comparer dans le test de l' unité , une alternative pratique est EqualValues fonctionnent en témoigner .
la source