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的返回是假的?当内容值是一个字符串,一个映射时,DeepEqual为真
打印出问题中的两个值,我们可以看到它们是不同的:
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数组可以包含不同类型的值。
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"}}
这不是真的