golang DeepEqual:当接口映射的值的类型是数组时,DeepEqual是无效的

时间:2014-03-18 03:39:52

标签: json go

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为真。

2 个答案:

答案 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"}}

事实并非如此。