You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何逐行读取存储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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 10:30:55