9

鉴于这两个测试用例:

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)

这是 go playground 上的类似代码,因此您可以轻松破解它。

4

1 回答 1

16

我想到了!JSON只有一种数值类型,即浮点数,因此在编组/解组过程中所有整数都转换为Float64。因此,在res地图中,5 是 float64 而不是 int。

是一个围棋游乐场,它提供了我正在谈论的内容和证据。

于 2013-06-25T19:45:07.990 回答