【发布时间】: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