非常抱歉,我理解错误。你正确指出了删除节点时需要从其父节点的子节点列表中删除该节点的ID。以下是更新后的代码示例:
type NginxResourceGroup struct {
ID int
Pid int
Name string
ChildNodes []NginxResourceGroup // 子节点列表
}
func deleteNode(db *gorm.DB, nodeID int) error {
var node NginxResourceGroup
// 查询待删除节点是否存在
if err := db.Where("ID = ?", nodeID).First(&node).Error; err != nil {
return errors.New("待删除节点不存在")
}
// 删除当前节点及其所有子节点
if err := deleteRecursive(db, &node); err != nil {
return err
}
return nil
}
func deleteRecursive(db *gorm.DB, node *NginxResourceGroup) error {
for i := range node.ChildNodes {
childNode := &node.ChildNodes[i]
if err := deleteRecursive(db, childNode); err != nil { // 递归删除子节点的子节点
return err
}
if err := db.Delete(childNode).Error; err != nil { // 删除当前子节点记录
return err
}
}
// 从父节点的子节点列表中删除当前节点
parentNode := &NginxResourceGroup{}
if node.Pid > 0 && db.First(parentNode, "ID = ?", node.Pid).RowsAffected > 0 {
for i, child := range parentNode.ChildNodes {
if child.ID == node.ID {
parentNode.ChildNodes = append(parentNode.ChildNodes[:i], parentNode.ChildNodes[i+1:]...)
break
}
}
db.Save(parentNode)
}
return nil
}
上述代码中,在 deleteRecursive()
函数中,除了删除当前节点及其子节点记录外,还添加了从父节点的子节点列表中删除当前节点的逻辑。通过查询到父节点,并在循环中找到当前节点后进行删除操作。
同样,请注意根据你的实际数据结构和库选择对代码进行适当修改。
内容由零声教学AI助手提供,问题来源于学员提问