猿问

DeepEqual:为什么未编组的映射返回 DeepEqual() 结果与看似相同的文字不同

我不明白如何比较未编组的 JSON。例子:


package main


import (

    "fmt"

    "reflect"

    "encoding/json"

)


func main() {

    a := map[string]interface{} {"foo": 1, "bar": 2}

    b := map[string]interface{} {"bar": 2, "foo": 1}

    fmt.Printf("Literal B is %v, DeepEqual is %v\n", b, reflect.DeepEqual(a, b))


    err := json.Unmarshal([]byte(`{"bar": 2, "foo": 1}`), &b)

    if err != nil {

        panic("Could not unmarshal")

    }

    fmt.Printf("Umarshalled B is %v, DeepEqual is %v\n", b, reflect.DeepEqual(a, b))

}

印刷


文字 B 是 map[bar:2 foo:1],DeepEqual 为真


Umarshalled B 是 map[bar:2 foo:1],DeepEqual 是假的


在 JSON 解组之后,从文字初始化的 B 和 B 有什么不同?


牛魔王的故事
浏览 142回答 1
1回答

胡子哥哥

这回答了你的问题:fmt.Printf("%T\n", b["foo"]) // Prints "float64" after unmarshaling.JSON 数字是 64 位浮点数,而您的原始地图值是整数。从文档:要将 JSON 解组为接口值,Unmarshal 将其中之一存储在接口值中:bool, for JSON booleansfloat64, for JSON numbersstring, for JSON strings[]interface{}, for JSON arraysmap[string]interface{}, for JSON objectsnil for JSON null
随时随地看视频慕课网APP

相关分类

Go
我要回答