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

Go语言结构体切片追加后仅最后一个写入JSON问题求助

问题原因

核心问题在于每次执行b/c命令时程序都是全新启动的,全局变量SomeData会被重新初始化为空的&Data{}。你每次只追加一个新元素就直接写入文件,相当于用新的单元素切片覆盖了之前的文件,所以永远只能看到最后一次添加的元素。

解决方案

要实现累计保存所有结构体的效果,必须在每次程序启动时先从JSON文件加载已有的数据,再执行追加操作,最后写入文件。

修改步骤

  1. 在a.go中添加Load方法,用于从文件读取并解析数据到Data切片
  2. 在程序启动时加载已有数据,确保在添加元素前完成

代码修改示例

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 07:05:03