Golang中无法追加/覆盖JSON文件的问题如何解决
Golang中无法追加/覆盖JSON文件的问题如何解决 大家好,我是Go语言的新手,目前仍在学习阶段,现在在修改JSON文件时遇到了困难。
我有一个函数,其基本功能是从切片中移除一个元素。我无法在除了一个特定位置之外的其他地方向JSON文件追加内容。"Done"总是会被打印出来,对此有什么建议吗?谢谢 🙂
func removeAppt(remove AppointmentsDetail) {
bookedAppointmentsData := getBookedAppointmentsData() // 获取数据切片
for i := 0; i < len(bookedAppointmentsData); i++ {
bookedAppt := bookedAppointmentsData[i]
//如果匹配输入值,则将其从切片中移除并追加到json
if bookedAppt == remove {
bookedAppointmentsData = append(bookedAppointmentsData[:i], bookedAppointmentsData[i+1:]...)
i--
bytes, err := json.MarshalIndent(bookedAppointmentsData, "", " ")
if err != nil {
log.Fatalln(err)
}
_ = ioutil.WriteFile("bookedAppointments.json", bytes, 0644)
fmt.println("Done") //总是会被打印
break
}
}
}
更多关于Golang中无法追加/覆盖JSON文件的问题如何解决的实战教程也可以访问 https://www.itying.com/category-94-b0.html
3 回复
它已成功找到你想要移除的 AppointmentDetail;你知道这一点是因为“Done”被打印出来了。
文件是否被创建?我会检查 ioutil.WriteFile 调用返回的值。
更多关于Golang中无法追加/覆盖JSON文件的问题如何解决的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
它之所以持续被打印出来,是因为它定义在结构体 AppointmentsDetail 中。我认为你可以设置 'omitempty' 标志。例如:
Done bool int `json:",omitempty"`
这是一个典型的JSON文件读写问题。你的代码逻辑基本正确,但有几个关键点需要注意:
func removeAppt(remove AppointmentsDetail) {
bookedAppointmentsData := getBookedAppointmentsData()
for i := 0; i < len(bookedAppointmentsData); i++ {
bookedAppt := bookedAppointmentsData[i]
// 确保AppointmentsDetail结构体实现了可比较的方法
// 如果结构体包含切片、映射等不可比较字段,需要自定义比较逻辑
if bookedAppt == remove {
// 移除元素
bookedAppointmentsData = append(bookedAppointmentsData[:i], bookedAppointmentsData[i+1:]...)
// 序列化并写入文件
bytes, err := json.MarshalIndent(bookedAppointmentsData, "", " ")
if err != nil {
log.Fatalln("JSON序列化失败:", err)
}
// 使用os.WriteFile替代已弃用的ioutil.WriteFile
err = os.WriteFile("bookedAppointments.json", bytes, 0644)
if err != nil {
log.Fatalln("文件写入失败:", err)
}
fmt.Println("Done") // 这行总是执行是因为匹配成功后立即break
return // 使用return而不是break,避免后续不必要的循环
}
}
// 如果没有找到匹配项
fmt.Println("未找到匹配的预约")
}
如果结构体比较有问题,可以这样修改比较逻辑:
func removeAppt(remove AppointmentsDetail) {
bookedAppointmentsData := getBookedAppointmentsData()
found := false
for i := 0; i < len(bookedAppointmentsData); i++ {
bookedAppt := bookedAppointmentsData[i]
// 自定义比较逻辑示例
if bookedAppt.ID == remove.ID && bookedAppt.Date == remove.Date {
bookedAppointmentsData = append(bookedAppointmentsData[:i], bookedAppointmentsData[i+1:]...)
found = true
break
}
}
if found {
bytes, err := json.MarshalIndent(bookedAppointmentsData, "", " ")
if err != nil {
log.Fatalln("JSON序列化失败:", err)
}
err = os.WriteFile("bookedAppointments.json", bytes, 0644)
if err != nil {
log.Fatalln("文件写入失败:", err)
}
fmt.Println("Done")
} else {
fmt.Println("未找到匹配的预约")
}
}
主要问题可能在于:
AppointmentsDetail结构体的比较可能不按预期工作- 文件写入权限问题
- JSON文件路径问题
确保 getBookedAppointmentsData() 函数正确读取了JSON文件数据。

