想做一个地址库的树状查询,
可是这个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... range...遍历时,每次golang都会进行值拷贝,
所以每次
findChildren
函数返回的结果都是赋值给了局部变量region一般有2个修改方案:
1、将切片定义改为指针,需要修改数据结构定义,同时修改代码
2、直接换一种循环遍历方式: