编码/解码后结构发生变化

时间:2017-02-09 10:27:37

标签: json go struct

我目前遇到的问题是在将结构保存到json文件然后从json文件打开结构之后,结构的属性稍微改变了。

在结构N中,有时A和B可以指向相同的J.但是,在编码之后然后解码它们指向值的不同Js。

在编码之前返回true(预期)。解码后,它返回false(不是预期的)

fmt.Println("is same pointer", n.A[0] == n.B[0])

这应该发生吗?有没有解决的办法。谢谢。

type N struct {
        A       []*J
        B  []*J
        C []*J
    }

func (n *N) Save(name string) {
    name = "radacted.json"
    err := os.Remove(name)
    file, err := os.Create(name)
    defer file.Close()
    if err != nil {
        fmt.Println(err)
    }
    bytes, err := json.Marshal(n)
    file.Write(bytes)
}

func Open(name string) *N {
    bytes, err := ioutil.ReadFile("redacted.json")    
    if err != nil {
        log.Fatal("decode error:", err)
    }
    var n NeuralNetwork
    json.Unmarshal(bytes, &n)

    return &n
}

2 个答案:

答案 0 :(得分:3)

预期和记录的行为

  

指针值编码为指向的值。

您可以断言值相等

*n.A[0] == *n.B[0]  //should stay

答案 1 :(得分:1)

  

fmt.Println("is same pointer", n.A[0] == n.B[0])

您正在比较此处的地址值,因此它将不相同。让我给你举个例子 假设你有这样的结构:

type Test struct {
    ValueA *int
    ValueB *int
}

并在您的主函数上添加相同的值,但在这种情况下使用不同的地址添加不同的变量:

func main() {
    hello := 12
    hello2 := 12
    testObject := Test{ValueA: &hello, ValueB: &hello2}
    if *testObject.ValueA == *testObject.ValueB {
        fmt.Println("Equal Value")
    } else {
        fmt.Println("Different  Value")
    }
}

请注意,*testObject.ValueA*testObject.ValueB获取的确切值不是值地址。如果您不使用*,结果会有所不同。

因为uvelichitel表示在比较结构值时只需要使用*