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/