Go 如何比较嵌套结构,子切片字段中的字段相同,但顺序不同
在以下代码中,a1和a2是相同的。它们有相同的字段,但顺序不同。书A和书B的顺序不同。当我使用DeepEqual方法进行比较时,结果表明它们不相等。如何比较它们并得出它们相等的结果Go 如何比较嵌套结构,子切片字段中的字段相同,但顺序不同,go,compare,go-reflect,Go,Compare,Go Reflect,在以下代码中,a1和a2是相同的。它们有相同的字段,但顺序不同。书A和书B的顺序不同。当我使用DeepEqual方法进行比较时,结果表明它们不相等。如何比较它们并得出它们相等的结果 package main import ( "fmt" "reflect" ) type Author struct { name string Books []*Book } type Book struct { id int name
package main
import (
"fmt"
"reflect"
)
type Author struct {
name string
Books []*Book
}
type Book struct {
id int
name string
}
func main() {
a1 := Author{
name: "Author Name",
Books: []*Book {
{
id: 1,
name: "Book A",
},
{
id: 2,
name: "Book B",
},
},
}
a2 := Author{
name: "Author Name",
Books: []*Book {
{
id: 2,
name: "Book B",
},
{
id: 1,
name: "Book A",
},
},
}
fmt.Println("Is a1 equal to a2: ", reflect.DeepEqual(a1, a2))
}
结果:
Is a1 equal to a2: false
参考:
当以下所有条件均为真时,切片值完全相等:它们
都是零或都是非零,它们具有相同的长度,并且
它们指向相同基础数组的相同初始项
也就是说,&x[0]==&y[0]或其对应的元素
长度完全相等。请注意,非nil空片和nil
例如,切片[]字节{}和[]字节{}不是完全相等的
因此,它解释了为什么它不适合你!基础数组不相等或对应的元素不相等。在比较之前对它们进行排序如何?如果它们具有相同的元素和顺序,则数组可以进行比较。因此,对元素进行排序可以解决这个问题,或者使书籍成为地图[id]*书籍。或者编写您自己的相等函数。排序修复了其结构字段的顺序不能不同。如果是,则它们不是相同的结构,因此比较将失败。