Saya ingin memeriksa apakah dua struct, slice, dan maps sama.
Tapi saya mengalami masalah dengan kode berikut. Lihat komentar saya di baris yang relevan.
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.dll
sumber
sumber
Jawaban:
Anda dapat menggunakan reflect.DeepEqual , atau Anda dapat menerapkan fungsi Anda sendiri (yang kinerjanya bijaksana akan lebih baik daripada menggunakan refleksi):
http://play.golang.org/p/CPdfsYGNy_
sumber
reflect.DeepEqual
sering salah digunakan untuk membandingkan dua struct serupa, seperti dalam pertanyaan Anda.cmp.Equal
adalah alat yang lebih baik untuk membandingkan struct.Untuk melihat mengapa refleksi tidak disarankan, mari kita lihat dokumentasinya :
Jika kita membandingkan dua
time.Time
nilai waktu UTC yang sama,t1 == t2
akan menjadi salah jika zona waktu metadatanya berbeda.go-cmp
mencariEqual()
metode dan menggunakannya untuk membandingkan waktu dengan benar.Contoh:
sumber
go-cmp
dan tidakreflect
.Inilah cara Anda menggulirkan fungsi Anda sendiri http://play.golang.org/p/Qgw7XuLNhb
sumber
if len(a.Z) != len(b.Z) || len(a.M) != len(b.M) { return false }
, karena salah satu dari mereka dapat memiliki bidang ekstra.Sejak Juli 2017 Anda dapat menggunakan
cmp.Equal
dengancmpopts.IgnoreFields
opsi.sumber
Jika Anda membandingkan mereka dalam tes unit , alternatif berguna adalah EqualValues berfungsi dalam bersaksi .
sumber