【问题标题】:How to compare nested structs, with same fields in child slice fields but in different order如何比较嵌套结构,在子切片字段中具有相同字段但顺序不同
【发布时间】:2020-03-11 07:00:21
【问题描述】:

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

【问题讨论】:

  • 在比较之前把它们整理一下怎么样?
  • 数组可以比较它们是否具有相同的元素和顺序。因此,对元素进行排序可以解决问题
  • 或将 Books 设为地图[id]*Book。或者编写自己的相等函数。
  • 排序修复了它
  • 结构字段的顺序不能不同。如果是,则它们不是同一个结构,因此比较将失败。

标签: go compare go-reflect


【解决方案1】:

参考:reflect.DeepEqual

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

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

【讨论】:

    猜你喜欢
    • 2021-12-26
    • 2016-03-17
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 2021-11-18
    • 2016-02-23
    • 1970-01-01
    • 2013-06-22
    相关资源
    最近更新 更多