对不起,我之前给出的示例代码确实没有包含递归删除节点及其子节点的逻辑。下面是一个修正后的版本:
// 递归删除节点及其子节点
func deleteNode(db *gorm.DB, id int) error {
node, err := findNodeWithChildren(db, id)
if err != nil {
return err
}
tx := db.Begin()
defer func() {
if r := recover(); r != nil {
tx.Rollback()
}
}()
var childIDs []int
getAllChildIDs(&node, &childIDs)
childIDs = append(childIDs, node.ID)
if err := tx.Where("id IN (?)", childIDs).Delete(NginxResourceGroup{}).Error; err != nil {
tx.Rollback()
return err
}
parent := NginxResourceGroup{}
tx.First(&parent, node.Pid)
for i := range parent.Children {
if parent.Children[i] == node.ID {
parent.Children = append(parent.Children[:i], parent.Children[i+1:]...)
break
}
}
tx.Save(&parent)
tx.Commit()
return nil
}
// 递归获取所有子节点ID
func getAllChildIDs(node *NginxResourceGroup, ids *[]int) {
for _, childID := range node.Children {
childNode := NginxResourceGroup{}
db.First(&childNode, childID)
*ids = append(*ids, childID)
if len(childNode.Children) > 0 {
getAllChildIDs(&childNode, ids)
}
}
}
现在,deleteNode 函数会使用递归方式找到待删除节点以及其所有子节点,并一次性删除它们。同时,getAllChildIDs 函数会递归获取所有子节点的ID,以便在删除操作中使用。
非常抱歉之前给出的代码没有正确实现递归删除节点的功能。希望这个修正后的示例能够满足您的需求。如果还有任何问题,请随时提问。
内容由零声教学AI助手提供,问题来源于学员提问




