猿问

为什么把两个不同的对象解码成同一个对象,但是bool成员没有变?

我正在使用 go 的 encoding/gob 将类型为 T 的两个不同对象解码为同一个对象,但是对象的 bool 成员在第二次解码后没有改变。为什么?


package main


import (

    "fmt"

    "encoding/gob"

    "bytes"

)


type T struct {

    X int

    Y string

    Z bool

}


func main() {

    t := T{}

    buf := new(bytes.Buffer)

    enc := gob.NewEncoder(buf)

    dec := gob.NewDecoder(buf)


    t1 := T{1, "1", true}

    enc.Encode(t1)

    dec.Decode(&t)

    fmt.Printf("%+v\n", t)


    // If t is a new entity, the second decode into t can product expected result: {X:2 Y:2 Z:false}

    // otherwise, t's bool member has not been changed after the second decode.

    // t = T{}

    t2 := T{2, "2", false}

    enc.Encode(t2)

    dec.Decode(&t)

    fmt.Printf("%+v\n", t)


    // result:

    // {X:1 Y:1 Z:true}

    // {X:2 Y:2 Z:true}

}


子衿沉夜
浏览 90回答 2
2回答

扬帆大鱼

如果一个字段的类型为零值(数组除外;见上文),它会从传输中被忽略。而“false”是零值。如果您尝试设置t2.X = 0它会显示相同的行为。

哈士奇WWW

意外行为来自重用内存而不清理它。您正在重复使用 t 和 b 两次,这会使您面临许多可能的错误。这是 t 产生你的问题,但它也可能是 b 。
随时随地看视频慕课网APP

相关分类

Go
我要回答