Ich möchte überprüfen, ob zwei Strukturen, Slices und Maps gleich sind.
Aber ich habe Probleme mit dem folgenden Code. Siehe meine Kommentare in den entsprechenden Zeilen.
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
quelle
quelle
Antworten:
Sie können Reflect.DeepEqual verwenden oder Ihre eigene Funktion implementieren (welche Leistung wäre besser als Reflection):
http://play.golang.org/p/CPdfsYGNy_
quelle
reflect.DeepEqual
wird oft fälschlicherweise verwendet, um zwei ähnliche Strukturen zu vergleichen, wie in Ihrer Frage.cmp.Equal
ist ein besseres Werkzeug zum Vergleichen von Strukturen.Um zu sehen, warum Reflexion schlecht beraten ist, schauen wir uns die Dokumentation an :
Wenn wir zwei
time.Time
Werte derselben UTC-Zeit vergleichen,t1 == t2
ist dies falsch, wenn ihre Metadaten-Zeitzone unterschiedlich ist.go-cmp
sucht nach derEqual()
Methode und verwendet diese, um die Zeiten korrekt zu vergleichen.Beispiel:
quelle
go-cmp
und nichtreflect
.So rollen Sie Ihre eigene Funktion: http://play.golang.org/p/Qgw7XuLNhb
quelle
if len(a.Z) != len(b.Z) || len(a.M) != len(b.M) { return false }
, da eines von ihnen zusätzliche Felder haben könnte.Seit Juli 2017 können Sie
cmp.Equal
mitcmpopts.IgnoreFields
Option verwenden.quelle
Wenn Sie sie sind zu vergleichen in Unit - Test , eine praktische Alternative ist EqualValues funktionieren in auszusagen .
quelle