golang切片数据转换为json tree树结构

父子切片数据转换为json树结构

package main

import (
	"database/sql"
	"fmt"
	"log"

	_ "github.com/go-sql-driver/mysql"
)

// MenuItem represents a menu item in the database
type MenuItem struct {
	ID       int64
	ParentID sql.NullInt64
	Title    string
	Level    int
	Sort     int
	Name     string
	Icon     string
	Hidden   int
	Children []*MenuItem
}

func main() {
	// Connect to the MySQL database
	db, err := sql.Open("mysql", "root:root@tcp(localhost:3306)/mall")
	if err != nil {
		log.Fatal(err)
	}
	defer db.Close()

	// Fetch all menu items from the database
	menuItems, err := getMenuItems(db)
	if err != nil {
		log.Fatal(err)
	}

	// Build the menu tree
	menuTree := buildMenuTree(menuItems, 0)

	// Print the menu tree
	printMenuTree(menuTree, 0)
}

func getMenuItems(db *sql.DB) ([]*MenuItem, error) {
	rows, err := db.Query("SELECT id, parent_id, title, level, sort, name, icon, hidden FROM ums_menu")
	if err != nil {
		return nil, err
	}
	defer rows.Close()

	var menuItems []*MenuItem

	for rows.Next() {
		var menuItem MenuItem
		err := rows.Scan(&menuItem.ID, &menuItem.ParentID, &menuItem.Title, &menuItem.Level, &menuItem.Sort, &menuItem.Name, &menuItem.Icon, &menuItem.Hidden)
		if err != nil {
			return nil, err
		}
		menuItems = append(menuItems, &menuItem)
	}

	return menuItems, nil
}

func buildMenuTree(menuItems []*MenuItem, parentID int64) []*MenuItem {
	var result []*MenuItem

	for _, item := range menuItems {
		if item.ParentID.Int64 == parentID {
			children := buildMenuTree(menuItems, item.ID)
			item.Children = children
			result = append(result, item)
		}
	}

	return result
}

func printMenuTree(menuItems []*MenuItem, level int) {
	for _, item := range menuItems {
		// Add indentation based on the level
		fmt.Printf("%s%s\n", getIndentation(level), item.Title)

		// Recursively print child items
		printMenuTree(item.Children, level+1)
	}
}

func getIndentation(level int) string {
	return fmt.Sprintf("%*s", level*2, "")
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值