考虑到这两个测试用例:
func TestEqualWhat(t *testing.T) {
testMarshalUnmarshal(t, map[string]interface{}{"a":"b"})
testMarshalUnmarshal(t, map[string]interface{}{"a":5})
}
testMarshalUnmarshal帮助器只是编组到json并退出:
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("\nExpected %#v\nbut got %#v", in, res)
t.FailNow()
}
}
为什么第一个测试用例通过而第二个测试用例失败?测试的结果如下:
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所以你可以很容易地对它进行攻击。
答案 0 :(得分:15)
我明白了! JSON只有一个数值类型,它是浮点数,因此所有整数都在marshal / unmarshal进程中转换为Float64。因此,在res
映射中,5是float64而不是int。
Here是一个游乐场,提供我正在谈论的内容和证据。