Go reflect.DeepEqual()返回false,但切片相同

Go reflect.DeepEqual()返回false,但切片相同,go,slice,reflect,Go,Slice,Reflect,我正在比较两个片段,都是[]int类型。其中一个以json的形式进入API,并解析为go结构。在结构中,它被初始化为空[]int{}。第二个数据保存在数据库MongoDb中,并被提取并映射到相同的结构类型 在某些情况下,这两个切片是完全空白的。但比较结果是错误的 reflect.deepequalSettings.S1,newSettings.S1 我还使用reflect.TypeOfnewSettings.S1检查了这两个字段的类型。它正在为这两个对象重新调整[]int 请考虑此游乐场链接为结

我正在比较两个片段,都是[]int类型。其中一个以json的形式进入API,并解析为go结构。在结构中,它被初始化为空[]int{}。第二个数据保存在数据库MongoDb中,并被提取并映射到相同的结构类型

在某些情况下,这两个切片是完全空白的。但比较结果是错误的

reflect.deepequalSettings.S1,newSettings.S1

我还使用reflect.TypeOfnewSettings.S1检查了这两个字段的类型。它正在为这两个对象重新调整[]int

请考虑此游乐场链接为结构示例。

谢谢

如果一个切片为nil,而另一个切片为长度为0的非nil切片,则返回false。从reflect.DeepEqual文件中引用:

当以下所有条件均为真时,切片值完全相等:它们都为零或都为非零,具有相同的长度,或者它们指向相同基础数组的相同初始项,即,&x[0]==&y[0],或者它们的对应元素的长度完全相等。请注意,非nil空片和nil片(例如,[]字节{}和[]字节})并不完全相等

例如:

oldSettings := OldSettings{S1: []int{}}
newSettings := NewSettings{}

if reflect.DeepEqual(oldSettings.S1, newSettings.S1) == false {
    fmt.Println("not equal")
} else {
    fmt.Println("equal")
}
这将在以下位置进行尝试:

如果您的JSON或MongoDB源中不存在S1字段,则在解组后,它将保留为零。但如果它作为一个空数组存在,则会在Go中为它创建一个空的非nil切片

举例证明:

var s struct {
    S1 []int
}

if err := json.Unmarshal([]byte(`{}`), &s); err != nil {
    panic(err)
}
fmt.Println(s, s.S1 == nil)

if err := json.Unmarshal([]byte(`{"S1":[]}`), &s); err != nil {
    panic(err)
}
fmt.Println(s, s.S1 == nil)
哪些输出可以在以下设备上试用:

如果一个切片为nil,而另一个切片为长度为0的非nil切片,则返回false。从reflect.DeepEqual文件中引用:

当以下所有条件均为真时,切片值完全相等:它们都为零或都为非零,具有相同的长度,或者它们指向相同基础数组的相同初始项,即,&x[0]==&y[0],或者它们的对应元素的长度完全相等。请注意,非nil空片和nil片(例如,[]字节{}和[]字节})并不完全相等

例如:

oldSettings := OldSettings{S1: []int{}}
newSettings := NewSettings{}

if reflect.DeepEqual(oldSettings.S1, newSettings.S1) == false {
    fmt.Println("not equal")
} else {
    fmt.Println("equal")
}
这将在以下位置进行尝试:

如果您的JSON或MongoDB源中不存在S1字段,则在解组后,它将保留为零。但如果它作为一个空数组存在,则会在Go中为它创建一个空的非nil切片

举例证明:

var s struct {
    S1 []int
}

if err := json.Unmarshal([]byte(`{}`), &s); err != nil {
    panic(err)
}
fmt.Println(s, s.S1 == nil)

if err := json.Unmarshal([]byte(`{"S1":[]}`), &s); err != nil {
    panic(err)
}
fmt.Println(s, s.S1 == nil)
哪些输出可以在以下设备上试用:

{[]} true
{[]} false