package main
import (
"encoding/json"
"fmt"
"reflect"
)
func main() {
nodeArray := map[string]interface{}{
"meta": map[string]interface{}{
"category": "paragraph"}, "content": []string{"111"}}
// content is number as 111 or array
b, _ := json.Marshal(&nodeArray)
var nodeArrayTest map[string]interface{}
json.Unmarshal(b, &nodeArrayTest)
if !reflect.DeepEqual(nodeArray, nodeArrayTest) {
fmt.Println("!!!! odeArray and nodeArrayTest should be equal")
} else {
fmt.Println("odeArray and nodeArrayTest equal")
}
}
为什么当接口映射有数组(内容为数字为111或数组)时,DeepEqual的返回值为false?当内容值是字符串,地图时,DeepEqual为真。
答案 0 :(得分:3)
打印出两个值,我们可以看到它们是不同的:
nodeArray = map[string]interface {}{"meta":map[string]interface {}{"category":"paragraph"}, "content":[]string{"111"}}
nodeArrayTest = map[string]interface {}{"content":[]interface {}{"111"}, "meta":map[string]interface {}{"category":"paragraph"}}
特别是,nodeArray["content"]
是[]string
切片,而nodeArrayTest["content"]
是[]interface{}
切片。由于类型不匹配,reflect.DeepEqual
函数不认为它们相等。
encoding/json
模块解码为[]interface{}
切片,因为JSON数组可以包含不同类型的值。
答案 1 :(得分:-2)
aaa := map[string]interface {}{"meta":map[string]interface {}{"category":"paragraph"}, "content":[]string{"111","222"}}
bbb := map[string]interface {}{"content":[]string{"222","111"}, "meta":map[string]interface {}{"category":"paragraph"}}
事实并非如此。