我目前遇到的问题是在将结构保存到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
}
答案 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表示在比较结构值时只需要使用*
。