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(®ionTree).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(®ionTree).Error
if err != nil {
panic(err)
}
if left > 1 {
for _, region := range regionTree {
region.Children = findChildren(tx, region.ID, left-1)
}
}
return regionTree
}
以下是返回数组
回答
在其他地方找到了答案,有时间改用指针试一下:
以下为引用
`for _, v := range tree
我在遍历这个tree数组的时候传递的是数组对象,修改了数组的内容但返回时发现没有变化。这就是golang和java的差别,遍历的时候如果是非指针对象,那么golang会copy一个副本v,你修改的只是v的值,除非你修改完再重新放入数组,否则结果是不会变的。或者使用指针传递,使用数组的指针就没问题了。
`
https://blog.csdn.net/chinawszjr/article/details/103930154
问题就是你找到的答案,主要是由于你用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)
}
以上是 GO递归查询后树状对象返回时,children为nil 的全部内容, 来源链接: utcz.com/a/40117.html