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")
    }
}

为什么当接口(interface)映射具有array(内容为数字或111的数组)时,DeepEqual的返回为false?当内容值为字符串,映射时,则DeepEqual为true。

最佳答案

打印出两个值,我们可以看到它们是不同的:

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 slice ,而nodeArrayTest["content"][]interface{} slice 。由于类型不匹配,reflect.DeepEqual函数认为这些不相等。

因为JSON数组可以包含不同类型的值,所以encoding/json模块解码为[]interface{} slice 。

关于json - golang DeepEqual : when the type of value of interface map is array, DeepEqual无效,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22469917/

10-09 15:20