golang DeepEqual:当接口映射的值类型为array时,DeepEqual无效


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

这不是真的

最新更新