9

次の 2 つのテスト ケースがあるとします。

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()
    }
}

最初のテスト ケースが成功し、2 番目のテスト ケースが失敗するのはなぜですか? テストの出力は次のとおりです。

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 には浮動小数点の数値型が 1 つしかないため、すべての整数は整列化/非整列化プロセスで Float64 に変換されます。したがって、resマップでは、5 は int ではなく float64 です。

これは、私が話していることのコンテキストと証拠を提供する go プレイグラウンドです。

于 2013-06-25T19:45:07.990 に答える