Go 如何比较嵌套结构,子切片字段中的字段相同,但顺序不同

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

在以下代码中,a1和a2是相同的。它们有相同的字段,但顺序不同。书A和书B的顺序不同。当我使用DeepEqual方法进行比较时,结果表明它们不相等。如何比较它们并得出它们相等的结果

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]*书籍。或者编写您自己的相等函数。排序修复了其结构字段的顺序不能不同。如果是,则它们不是相同的结构,因此比较将失败。