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("未找到匹配的预约")
    }
}

主要问题可能在于:

  1. AppointmentsDetail 结构体的比较可能不按预期工作
  2. 文件写入权限问题
  3. JSON文件路径问题

确保 getBookedAppointmentsData() 函数正确读取了JSON文件数据。

回到顶部