如何逐行读取存储Gob序列化对象的文件?
Gob序列化追加存储后的读取方案
首先明确:Gob序列化的是二进制流,没有行结构,所以逐行读取的思路完全不适用,别在这上面浪费时间。
你现在的追加单个Message的存储方式没问题,而且比每次重写切片高效得多,问题出在读取逻辑上——你只调用了一次Decode,自然只能拿到第一个对象。正确的做法是循环调用解码器的Decode方法,直到遇到EOF错误。
写入示例代码
import ( "encoding/gob" "os" ) func writeMessage(path string, msg Message) error { f, err := os.OpenFile(path, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644) if err != nil { return err } defer f.Close() enc := gob.NewEncoder(f) return enc.Encode(msg) }
每次新增消息时,直接调用这个函数追加即可,无需读取整个文件。
读取示例代码
import ( "encoding/gob" "io" "os" ) func readMessages(path string) ([]Message, error) { f, err := os.Open(path) if err != nil { return nil, err } defer f.Close() dec := gob.NewDecoder(f) var msgs []Message for { var msg Message err := dec.Decode(&msg) if err == io.EOF { break // 读到文件末尾,结束循环 } if err != nil { return nil, err } msgs = append(msgs, msg) } return msgs, nil }
这个函数会循环解码文件中的所有Message对象,直到读完整个文件。
补充说明
Gob解码器本身就支持处理连续的序列化对象流,只要你写入时是逐个Encode单个对象,读取时循环Decode就能全部解析出来。之前的问题只是读取逻辑没写对,完全不用回到每次重写切片的低效方案。
内容的提问来源于stack exchange,提问作者nem0z
相关产品推荐
相关产品推荐

