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

}

以下是返回数组

回答

在其他地方找到了答案,有时间改用指针试一下:

以下为引用
`
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

回到顶部