试图了解 Go gob 编码器的工作原理
trying to understand how the Go gob encoder works
我想了解 gob 的工作原理。我有几个问题。
我知道 gob 序列化了一个 go 类型,比如 struct map 或 interface(我们必须注册它的真实类型)但是:
func (dec *Decoder) Decode(e interface{}) error
Decode reads the next value from the input stream and stores it in the data represented by the
empty interface value.
If e is nil, the value will be discarded.
Otherwise, the value underlying e must be a pointer to the correct type for the next data item received.
If the input is at EOF, Decode returns io.EOF and does not modify e.
我对这份文档一无所知。它们的意思是(从输入流中读取下一个值)它们是我们可以发送给它的一个数据,它是一个结构或映射,但不是很多。它们的意思是什么如果 e 为 nil,则该值将被丢弃。请专家给我解释一下,我一整天都很沮丧,什么也没找到
自从输入这个答案后,我才知道 OP 在拖我们的后腿。停止喂巨魔。
您可以将多个值写入一个流。您可以从流中读取多个值。
此代码将两个值写入输出流 w,一个 io.Writer:
e := gob.NewEncoder(w)
err := e.Encode(v1)
if err != nil {
// handle error
}
err := e.Encode(v2)
if err != nil {
// handle error
}
此代码从 io.Reader 流 r 中读取值。每次调用 Decode 都会读取一个值,该值是通过调用 Decode 写入的。
d := gob.NewDecoder(r)
var v1 V
err := e.Decode(&v1)
if err != nil {
// handle error
}
var v2 V
err := e.Decode(&v2)
if err != nil {
// handle error
}
将多个值写入流可以提高效率,因为有关每个编码类型的信息只写入一次流。
我想了解 gob 的工作原理。我有几个问题。
我知道 gob 序列化了一个 go 类型,比如 struct map 或 interface(我们必须注册它的真实类型)但是:
func (dec *Decoder) Decode(e interface{}) error
Decode reads the next value from the input stream and stores it in the data represented by the
empty interface value.
If e is nil, the value will be discarded.
Otherwise, the value underlying e must be a pointer to the correct type for the next data item received.
If the input is at EOF, Decode returns io.EOF and does not modify e.
我对这份文档一无所知。它们的意思是(从输入流中读取下一个值)它们是我们可以发送给它的一个数据,它是一个结构或映射,但不是很多。它们的意思是什么如果 e 为 nil,则该值将被丢弃。请专家给我解释一下,我一整天都很沮丧,什么也没找到
自从输入这个答案后,我才知道 OP 在拖我们的后腿。停止喂巨魔。
您可以将多个值写入一个流。您可以从流中读取多个值。
此代码将两个值写入输出流 w,一个 io.Writer:
e := gob.NewEncoder(w)
err := e.Encode(v1)
if err != nil {
// handle error
}
err := e.Encode(v2)
if err != nil {
// handle error
}
此代码从 io.Reader 流 r 中读取值。每次调用 Decode 都会读取一个值,该值是通过调用 Decode 写入的。
d := gob.NewDecoder(r)
var v1 V
err := e.Decode(&v1)
if err != nil {
// handle error
}
var v2 V
err := e.Decode(&v2)
if err != nil {
// handle error
}
将多个值写入流可以提高效率,因为有关每个编码类型的信息只写入一次流。