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("\nExpected %#v\nbut 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.