2017-02-09 9 views
-1

現在、問題は、jsonファイルに構造体を保存してからjsonファイルから構造体を開くと、構造体のプロパティが少し変わったことです。エンコード/デコード後の構造の変更

構造体Nでは、AとBが同じJを指すことがあります。ただし、エンコード後にデコードすると、値の異なるJを指します。

これをエンコードする前に、true(期待値)が返されます。それをデコードした後、それは偽を返す(期待していない)

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 
} 

答えて

3

値が指されるよう

ポインタ値を符号化します。

あなたは、それは同じではありませんので、あなたはここでアドレス値を比較している

*n.A[0] == *n.B[0] //should stay 
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は、あなたの構造体の値を比較するときに*を使用する必要があると言いました。

関連する問題