明白了,如果节点信息保存在数据库中,您可以通过数据库查询将所有节点取出来,并使用适当的数据结构进行组织和操作。以下是一个示例代码:
package main
import (
"database/sql"
"fmt"
_ "github.com/go-sql-driver/mysql"
)
type NginxResourceGroup struct {
ID int
Pid int
Name string
Remarks string
State int
}
func main() {
db, err := sql.Open("mysql", "username:password@tcp(localhost:3306)/dbname")
if err != nil {
fmt.Println(err)
return
}
defer db.Close()
rows, err := db.Query("SELECT id, pid, name, remarks, state FROM nginx_resource_group")
if err != nil {
fmt.Println(err)
return
}
defer rows.Close()
nodes := make(map[int]*NginxResourceGroup)
for rows.Next() {
node := new(NginxResourceGroup)
err = rows.Scan(&node.ID, &node.Pid, &node.Name, &node.Remarks, &node.State)
if err != nil {
fmt.Println(err)
continue
}
nodes[node.ID] = node
if !isValidTree(nodes) {
fmt.Printf("Invalid tree structure after inserting node %d\n", node.ID)
delete(nodes, node.ID)
}
}
rootNode := findRootNode(nodes)
if rootNode == nil {
fmt.Println("No root node found in the database.")
return
}
fmt.Println("Tree structure:")
printTree(rootNode, 0, nodes)
}
func isValidTree(nodes map[int]*NginxResourceGroup) bool {
for _, node := range nodes {
parent := nodes[node.Pid]
if parent == nil && node.Pid != 0 {
return false
}
}
return true
}
func findRootNode(nodes map[int]*NginxResourceGroup) *NginxResourceGroup {
for _, node := range nodes {
if node.Pid == 0 {
return node
}
}
return nil
}
func printTree(node *NginxResourceGroup, level int, nodes map[int]*NginxResourceGroup) {
fmt.Printf("%s%s (ID: %d)\n", getIndent(level), node.Name, node.ID)
for id, child := range nodes {
if child.Pid == node.ID && id != node.ID { // Avoid cyclic dependencies
printTree(child, level+1, nodes)
}
}
}
func getIndent(level int) string {
indent := ""
for i := 0; i < level; i++ {
indent += " "
}
return indent
}
在此示例代码中,我们使用database/sql
包来连接数据库,并执行查询语句从数据库中获取节点信息。然后,我们将这些节点保存在nodes
映射中,进行树形结构的校验和打印。
请确保您根据实际的数据库配置和数据表结构修改示例代码中的连接字符串、表名和字段名称。
内容由零声教学AI助手提供,问题来源于学员提问