2013-06-25 5 views
7

diese beiden Testfälle gegeben:Testing für tiefe Gleichheit mit json Serialisieren in golang

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

Wo der testMarshalUnmarshal Helfer Marschälle nur JSon und wieder heraus:

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

Warum funktioniert der erste Testfall Pass und der zweite scheitern? Der Ausgang des Tests ist dies:

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 dass Sie einen Hack es leicht haben können.

Antwort

13

ich es herausgefunden! JSON hat nur einen numerischen Typ, der Punkt schweben, so dass alle ganzen Zahlen Float64 im Marshal/unmarshal Prozess umgewandelt werden. Also, in der res Karte ist die 5 eine float64 anstelle eines int.

Here ist ein Go Spielplatz, der Kontext und die Beweise von dem, was ich rede bietet.