duanqiechui2378 2013-06-25 19:06
浏览 49
已采纳

在Golang中使用JSON封送测试进行深度平等

Given these two test cases:

func TestEqualWhat(t *testing.T) {
    testMarshalUnmarshal(t, map[string]interface{}{"a":"b"})
    testMarshalUnmarshal(t, map[string]interface{}{"a":5})
}

Where the testMarshalUnmarshal helper just marshals to json and back out:

func testMarshalUnmarshal(t *testing.T, in map[string]interface{}) {
    //marshal the object to a string
    jsb, err := json.Marshal(in);
    if err != nil {
        log.Printf("Unable to marshal msg")
        t.FailNow()
    }

    //unmarshal to a map
    res := make(map[string]interface{})
    if err := json.Unmarshal(jsb, &res); err != nil { t.FailNow() }

    if !reflect.DeepEqual(in, res) {
        log.Printf("
Expected %#v
but got  %#v", in, res)
        t.FailNow()
    }
}

Why does the first test case pass and the second fail? The output of the test is this:

Expected map[string]interface {}{"a":5}
but got  map[string]interface {}{"a":5}
--- FAIL: TestEqualWhat (0.00 seconds)

Here is similar code on the go playground so you can have a hack at it easily.

  • 写回答

1条回答 默认 最新

  • donglu8779 2013-06-25 19:45
    关注

    I figured it out! JSON only has one numerical type, which is floating point, so all integers are converted to Float64 in the marshal/unmarshal process. So, in the res map, the 5 is a float64 instead of an int.

    Here is a go playground that provides context and evidence of what I'm talking about.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 使用ue5插件narrative时如何切换关卡也保存叙事任务记录
  • ¥20 软件测试决策法疑问求解答
  • ¥15 win11 23H2删除推荐的项目,支持注册表等
  • ¥15 matlab 用yalmip搭建模型,cplex求解,线性化处理的方法
  • ¥15 qt6.6.3 基于百度云的语音识别 不会改
  • ¥15 关于#目标检测#的问题:大概就是类似后台自动检测某下架商品的库存,在他监测到该商品上架并且可以购买的瞬间点击立即购买下单
  • ¥15 神经网络怎么把隐含层变量融合到损失函数中?
  • ¥15 lingo18勾选global solver求解使用的算法
  • ¥15 全部备份安卓app数据包括密码,可以复制到另一手机上运行
  • ¥20 测距传感器数据手册i2c