2013-06-25 24 views
7

Với những trường hợp hai kiểm tra:kiểm tra cho bình đẳng sâu sắc với marshaling json theo golang

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

Trường hợp helper testMarshalUnmarshal chỉ marshals để JSON và sao lưu ra:

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

Tại sao trường hợp thử nghiệm đầu tiên vượt qua và lần thứ hai thất bại? Kết quả của thử nghiệm là:

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 để bạn có thể dễ dàng hack nó.

Trả lời

13

Tôi đã tìm ra! JSON chỉ có một kiểu số, đó là dấu phẩy động, vì vậy tất cả các số nguyên được chuyển đổi thành Float64 trong quá trình sắp xếp/nguyên soái. Vì vậy, trong bản đồ res, 5 là một float64 thay vì một int.

Here là sân chơi đi để cung cấp ngữ cảnh và bằng chứng về những gì tôi đang nói đến.

Các vấn đề liên quan