Welcome toVigges Developer Community-Open, Learning,Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
492 views
in Technique[技术] by (71.8m points)

GO递归查询后树状对象返回时,children为nil

想做一个地址库的树状查询,
可是这个children在查询sql里有值,但返回值中children返回了nil,是go里的数组/切片有特别的地方导致的?

func GetSysRegionTree(pid string, deep int) (err error, result []data.RegionTree) {
    var regionTree []data.RegionTree
    // 查询
    err = tx.Model(&model.SysRegion{}).Where("pid = ? and enabled = true", pid).Order("id asc", true).Find(&regionTree).Error

    if err != nil {
        panic(err)
    }

    for _, region := range regionTree {
        children := findChildren(tx, region.ID, deep-1)
        fmt.Println("children count = " + strconv.Itoa(len(children)))
        // TODO 这儿有个BUG,children没有返回
        region.Children = children
    }

    return err, regionTree
}
// @title 级联查询
func findChildren(tx *gorm.DB, pid string, left int) []data.RegionTree {
    var regionTree []data.RegionTree
    err := tx.Model(&model.SysRegion{}).Where("pid = ? and enabled = true", pid).Order("id desc", true).Find(&regionTree).Error
    if err != nil {
        panic(err)
    }
    if left > 1 {
        for _, region := range regionTree {
            region.Children = findChildren(tx, region.ID, left-1)
        }
    }
    return regionTree
}   

以下是返回数组
image.png


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

问题就是你找到的答案,主要是由于你用for... range...遍历时,每次golang都会进行值拷贝,
所以每次findChildren函数返回的结果都是赋值给了局部变量region
一般有2个修改方案:
1、将切片定义改为指针,需要修改数据结构定义,同时修改代码

*[]data.RegionTree

2、直接换一种循环遍历方式:

for i := 0; i < len(regionTree); i++{
            regionTree[i] = findChildren(tx, region.ID, left-1)
        }

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to Vigges Developer Community for programmer and developer-Open, Learning and Share
...