Go语言结构体切片追加后仅最后一个写入JSON问题求助
问题原因
核心问题在于每次执行b/c命令时程序都是全新启动的,全局变量SomeData会被重新初始化为空的&Data{}。你每次只追加一个新元素就直接写入文件,相当于用新的单元素切片覆盖了之前的文件,所以永远只能看到最后一次添加的元素。
解决方案
要实现累计保存所有结构体的效果,必须在每次程序启动时先从JSON文件加载已有的数据,再执行追加操作,最后写入文件。
修改步骤
- 在
a.go中添加Load方法,用于从文件读取并解析数据到Data切片 - 在程序启动时加载已有数据,确保在添加元素前完成
代码修改示例
1. 在a.go中新增Load方法
import ( "encoding/json" "io/ioutil" "os" ) // Load 从指定文件读取并解析数据到当前Data切片 func (d *Data) Load(filename string) error { // 文件不存在时直接返回,视为初始空数据 if _, err := os.Stat(filename); os.IsNotExist(err) { return nil } data, err := ioutil.ReadFile(filename) if err != nil { return err } // 将文件内容解析到当前切片中 return json.Unmarshal(data, d) }
2. 在root.go中添加初始化加载逻辑
通过init函数让程序启动时自动加载已有数据:
const ( JsonFile = ".file.json" ) var SomeData = &Data{} // 程序启动时自动加载历史数据 func init() { if err := SomeData.Load(JsonFile); err != nil { // 可根据实际需求处理错误,比如打印日志或panic panic(err) } }
3. b.go/c.go逻辑保持不变
原来的追加和保存代码无需修改,现在每次执行命令时,SomeData会先加载之前保存的所有数据,再追加新元素,最后写入覆盖文件,就能保留所有历史内容了。
验证流程
现在的执行逻辑变为:
- 程序启动 → 加载
.file.json中的历史数据到SomeData - 调用Add方法追加新元素
- 调用Save方法将包含新旧元素的完整切片写入文件
内容的提问来源于stack exchange,提问作者ZZZ
相关产品推荐
相关产品推荐

