假设我们有一个结构体Permission,包含了权限的ID和父级ID。我们想要将这个权限列表转换成一棵树形结构,其中每个节点表示一个权限对象。
type Permission struct {
ID int
ParentID int
// other fields
}
首先,我们需要定义一个带有子节点切片的树形结构:
type TreeNode struct {
Permission *Permission
Children []*TreeNode
}
然后,我们可以定义一个函数来递归地构建这棵树:
func buildTree(permissions []*Permission, parentID int) []*TreeNode {
var nodes []*TreeNode
for _, p := range permissions {
if p.ParentID == parentID {
node := &TreeNode{Permission: p}
children := buildTree(permissions, p.ID)
node.Children = children
nodes = append(nodes, node)
}
}
return nodes
}
该函数接受一个权限列表和一个父级ID作为参数,并返回由TreeNode组成的切片。它遍历所有具有指定父级ID的权限并将其添加到当前节点的子节点中。然后,对于每个子节点,它递归调用自身来构建子树。
最后,我们可以使用以下代码将权限列表转换为树:
func main() {
// 从数据库或其他来源获取权限列表
permissions := getPermissions()
// 将权限列表转换为树形结构
treeNodes := buildTree(permissions, 0)
// 打印树形结构
printTree(treeNodes, 0)
}
func printTree(nodes []*TreeNode, depth int) {
for _, node := range nodes {
fmt.Printf("%s%d\n", strings.Repeat(" ", depth), node.Permission.ID)
printTree(node.Children, depth+1)
}
}
在这个例子中,我们使用getPermissions()函数来获取权限列表。然后,我们将其传递给buildTree()函数,并指定父级ID为0,因为根节点没有父级。最后,我们使用printTree()函数打印树形结构。




