递归算法在Go项目实战的应用

递归算法在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
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值