如何在 Go 中将其解组为正确的顺序?

Sco*_*iel 3 json marshalling go unmarshalling

看来,如果我在 Go 中有一个按照特定顺序的接口{},并且我将其编组为 [] 字节,然后将其解组回接口{},则它应该保留原始顺序。它不是。结果是 DeepEqual 无法匹配两者,如下面的程序所示。

package main

import (
    "encoding/json"
    "fmt"
    "reflect"
)

func main() {
    var jd interface{}

    j := map[string]interface{}{
        "A": map[string]interface{}{"a": 1, "b": 2, "c": 3},
        "B": map[string]interface{}{"a": 1, "b": 2, "c": 3},
        "C": map[string]interface{}{
            "a": map[string]interface{}{"a": 1, "b": 2, "c": 3},
            "b": map[string]interface{}{"a": 1, "b": 2, "c": 3},
            "c": map[string]interface{}{"a": 1, "b": 2, "c": 3},
        },
    }

    s, _ := json.Marshal(j)
    _ = json.Unmarshal(s, &jd)

    fmt.Println(string(s))
    fmt.Println(j)
    fmt.Println(jd)
    if !reflect.DeepEqual(j, jd) {
        fmt.Println("Fail!")
    }
}
Run Code Online (Sandbox Code Playgroud)

该程序的结果是随机的,但这是一个典型的结果:

{"A":{"a":1,"b":2,"c":3},"B":{"a":1,"b":2,"c":3},"C":{"a":{"a":1,"b":2,"c":3},"b":{"a":1,"b":2,"c":3},"c":{"a":1,"b":2,"c":3}}}

map[B:map[a:1 b:2 c:3] C:map[c:map[a:1 b:2 c:3] a:map[b:2 c:3 a:1] b:map[a:1 b:2 c:3]] A:map[c:3 a:1 b:2]]

map[A:map[a:1 b:2 c:3] B:map[a:1 b:2 c:3] C:map[b:map[c:3 a:1 b:2] c:map[a:1 b:2 c:3] a:map[a:1 b:2 c:3]]]

Fail!
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,这些值 Marshal 为原始顺序,而 Unmarshal 为随机顺序(多次运行此程序将产生不同的结果)。结果是 DeepEqual 比较每次都失败(到目前为止)。

这是 Go 中的错误吗?有人可以建议解决方法吗?

pet*_*rSO 5

Go 编程语言规范

对于报表

映射的迭代顺序未指定,并且不保证从一次迭代到下一次迭代的顺序相同。

根据设计,映射的迭代顺序是伪随机的。