Как сравнить вложенные структуры с одинаковыми полями в полях дочернего среза, но в другом порядке - PullRequest
0 голосов
/ 11 марта 2020

В следующем коде 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

1 Ответ

0 голосов
/ 11 марта 2020

Ссылка: рефлекс ..DeepEqual

Значения среза глубоко равны, когда выполняются все следующие условия: они оба равны нулю или оба не равны нулю, они имеют одинаковые длины, и они либо указывают на одну и ту же начальную запись одного и того же базового массива (то есть & x [0] == & y [0]), либо их соответствующие элементы (вплоть до длины) глубоко равны. Обратите внимание, что ненулевой пустой слайс и нулевой слайс (например, [] byte {} и [] byte (nil)) не являются глубоко равными.

И, следовательно, это объясняет, почему он не работает для вас! Базовый массив не совпадает или соответствующие ему элементы не равны.

...