go語言將gorm查出來的數(shù)據(jù)組織為樹裝結(jié)構(gòu)

概述

使用PHP將數(shù)據(jù)組裝成樹狀結(jié)構(gòu),相當簡單,因為沒有類型的轉(zhuǎn)化限制等,數(shù)組即一切,而使用GO語言編寫成較為通用的代碼,相對要繁瑣一些,本文為包含了PHP及GO相關(guān)代碼

php組織分類樹,一個函數(shù)搞定

//本函數(shù)通過對地址的充分使用,只用一層循環(huán),便完成了對所有數(shù)據(jù)的樹狀結(jié)構(gòu)組織。
//id 數(shù)據(jù)主鍵
//parent_id 父級數(shù)據(jù)主鍵
public static function makeTree($records)
    {
        $tree = [];
        $data = [];
        foreach ($records as $item) {
            $item['children'] = [];
            $data[$item['id']] = $item;
        }
        foreach ($data as $item) {
            if ($item['parent_id'] != 0 && isset($data[$item['parent_id']])) {
                $data[$item['parent_id']]['children'][] = &$data[$item['id']];
            } else {
                $tree[] = &$data[$item['id']];
            }
        }
        return $tree;
    }

使用go完成相應(yīng)功能,要使用到接口

  1. 接口定義,組織樹狀結(jié)構(gòu)的方法,需要使用到此接口內(nèi)的相關(guān)方法
type NodeWithChildren interface {
    GetID() int
    GetParentID() int
    GetChildren() []NodeWithChildren
    SetChildren(children []NodeWithChildren)
}

2.方法

func BuildTree(nodes []NodeWithChildren) []NodeWithChildren {
    nodeMap := make(map[int]NodeWithChildren)
    // 將所有節(jié)點放入 map 中,以 ID 作為 key
    for _, node := range nodes {
        nodeMap[node.GetID()] = node
    }
    // 遍歷節(jié)點,根據(jù) ParentID 將子節(jié)點連接到對應(yīng)的父節(jié)點上
    var rootNodes []NodeWithChildren
    for _, node := range nodes {
        parentID := node.GetParentID()
        if parentID == 0 {
            rootNodes = append(rootNodes, node)
        } else {
            parent, ok := nodeMap[parentID]
            if ok {
                children := parent.GetChildren()
                children = append(children, node.(NodeWithChildren))
                parent.SetChildren(children)
            }
        }
    }

    return rootNodes
}

3.使用此方法的結(jié)構(gòu)體,必須實現(xiàn)接口所有方法,例

//以下為要組織成樹狀結(jié)構(gòu)的結(jié)構(gòu)體
type ArticleCategory struct {
    ID        int                      `gorm:"column:id;primaryKey;autoIncrement:true" json:"id"`
    Pid       int                      `gorm:"column:pid;not null" json:"pid"`
    Name      string                   `gorm:"column:name;not null" json:"name"`
    Intro     string                   `gorm:"column:intro" json:"intro"`
    Sort      int32                    `gorm:"column:sort;not null" json:"sort"`
    Cover     string                   `gorm:"column:cover" json:"cover"`
    DeletedAt gorm.DeletedAt           `gorm:"column:deleted_at" json:"deleted_at"`
    Children  []NodeWithChildren `gorm:"-"`//此處表示不從數(shù)據(jù)庫中查找此字段
}

func (c *ArticleCategory ) GetID() int {
    return c.ID
}

func (c *ArticleCategory ) GetParentID() int {
    return c.Pid
}

func (c *ArticleCategory ) GetChildren() []NodeWithChildren {
    return c.Children
}

func (c *ArticleCategory ) SetChildren(children []NodeWithChildren) {
    c.Children = children
}

func (c *ArticleCategory ) MakeTree(records []ArticleCategory ) []NodeWithChildren {
    var convertedNodes []NodeWithChildren
    for _, category := range records {//這一步很關(guān)鍵,此處將數(shù)據(jù)轉(zhuǎn)換為NodeWithChildren
        cat := category
        convertedNodes = append(convertedNodes, &cat)
    }
    return BuildTree(convertedNodes)
}

4.打印樹結(jié)構(gòu)

func PrintTree(trees interface{}) {
    b, _ := json.MarshalIndent(trees, "", "    ")
    fmt.Println(string(b))
}

4.使用gorm獲取數(shù)據(jù)并進行測試

var DB *gorm.DB

func initDb() {
    var err error
    DB, err = gorm.Open(mysql.Open("root:123456@tcp(127.0.0.1:3306)/test_db?charset=utf8mb4&parseTime=True&loc=Local&timeout=1000ms"), &gorm.Config{
        NamingStrategy: schema.NamingStrategy{
            SingularTable: true, //英語單數(shù)形式
        },
    })
    //gorm.Open(cfg.Driver, cfg.Source)
    DB = DB.Debug() //調(diào)式模式

    if err != nil {
        panic("數(shù)據(jù)庫連接失敗:" + err.Error())
    }
}

func main() {
    initDb()

    var mts []ArticleCategory 
    err := DB.Model(&ArticleCategory {}).Find(&mts).Error
    if err != nil {
        panic(err)
    }

    article := dao.ArticleCategory {}
    tree := article .MakeTree(mts)

    PrintTree(tree)//打印樹
}

以上,記錄php及go生成樹狀結(jié)構(gòu)的相關(guān)思路

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容