递归算法在Go项目实战的应用
生成树形结构
type MenuNode struct {
Id int `json:"id"`
Pid int `json:"parentId" tag:"parentId"`
TypeName string `json:"label"`
Noted string `json:"noted"`
Updated time.Time `json:"updated" xorm:"updated"`
Created time.Time `json:"created" xorm:"created"`
Children []*MenuNode `json:"children"`
}
func MetricTypeGetMenu(pid int) ([]*MenuNode, error) {
var menu []MetricType
err := DB["mon"].Table("metric_type").Where("pid=?", pid).Asc("id").Find(&menu)
errors.Dangerous(err)
tree := make([]*MenuNode, 0)
for _, list := range menu {
child, _ := MetricTypeGetMenu(list.Id)
node := &MenuNode{
Id: list.Id,
Pid: list.Pid,
TypeName: list.TypeName,
Noted: list.Noted,
Created: list.Created,
Updated: list.Updated,
}
node.Children = child
tree = append(tree, node)
}
return tree, nil
}
遍历树的子节点
func queryPid(pid int) ([]int, error) {
pids := make([]int, 0)
var demo MetricType
has, err := DB["mon"].Table("metric_type").Where("id=?", pid).Get(&demo)
if err != nil {
return nil, err
}
if !has {
return pids, nil
}
pids = append(pids, demo.Id)
ds, err := queryPid(demo.Pid)
pids = append(pids, ds...)
return pids, nil
}
遍历树的父节点
func queryNids(pid int) []int {
var nids []int
err := DB["mon"].Table("metric_type").Where("pid=?", pid).Select("id").Find(&nids)
errors.Dangerous(err)
nums := make([]int, 0)
for _, v := range nids {
nums = append(nums, v)
t := queryNids(v)
nums = append(nums, t...)
}
return nums
}