为什么把两个不同的对象解码成同一个对象,但是bool成员没有变?
Why decode two different objects into a same object, but the bool member has not been changed?
我正在使用 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}
}
基于文档:https://golang.org/pkg/encoding/gob/#hdr-Encoding_Details
If a field has the zero value for its type (except for arrays; see above), it is omitted from the transmission.
而"false"是零值。如果您尝试设置 t2.X = 0
,它会显示相同的行为。
意外行为是由于在不清理内存的情况下重用内存造成的。
您正在重复使用 t 和 b 两次,这会使您面临许多可能的错误。这里是 t 产生了你的问题,但它也可能是 b。
正如 nvcnvn 所回答的那样,gob 编码的预期行为是不考虑类型中具有 0 值的字段。查看编码结构的字节数增加大小:https://play.golang.org/p/HCz8-2kXHQX
如果你想在没有任何额外分配的情况下重用 bytes.Buffer 并且是安全的,请重置它的值:https://golang.org/pkg/bytes/#Buffer.Reset
我正在使用 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}
}
基于文档:https://golang.org/pkg/encoding/gob/#hdr-Encoding_Details
If a field has the zero value for its type (except for arrays; see above), it is omitted from the transmission.
而"false"是零值。如果您尝试设置 t2.X = 0
,它会显示相同的行为。
意外行为是由于在不清理内存的情况下重用内存造成的。 您正在重复使用 t 和 b 两次,这会使您面临许多可能的错误。这里是 t 产生了你的问题,但它也可能是 b。
正如 nvcnvn 所回答的那样,gob 编码的预期行为是不考虑类型中具有 0 值的字段。查看编码结构的字节数增加大小:https://play.golang.org/p/HCz8-2kXHQX
如果你想在没有任何额外分配的情况下重用 bytes.Buffer 并且是安全的,请重置它的值:https://golang.org/pkg/bytes/#Buffer.Reset