-2

在下面的代码中,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
4

1 回答 1

1

参考:reflect.DeepEqual

当满足以下所有条件时,切片值是完全相等的:它们都是 nil 或都非 nil,它们具有相同的长度,并且它们指向同一底层数组的相同初始条目(即 &x[0 ] == &y[0]) 或其对应的元素(直到长度)非常相等。请注意,非 nil 空切片和 nil 切片(例如,[]byte{} 和 []byte(nil))并不完全相等。

因此,它解释了为什么它不适合你!底层数组不相等或对应的元素不相等。

于 2020-03-11T08:13:00.400 回答