【问题标题】:golang why is value overwritten while implementing hierarchy tree?golang为什么在实现层次树时会覆盖值?
【发布时间】:2022-01-26 02:58:52
【问题描述】:
package main

import (
    "encoding/json"
    "fmt"
)

type employee struct {
    Name      string      `json:"name"`
    Id        int         `json:"id,omitempty"`
    ManagerId int         `json:"managerid"`
    Reporters []employee `json:"reporters,omitempty"`
}

// type employees struct {
//  employees []employee `json:"employee"`
// }

type EmployeeList struct {
    employees map[int]employee
    root  employee
}

func NewEmployeeList() *EmployeeList {
    var el EmployeeList
    el.employees = make(map[int]employee)
    return &el
}


func (el *EmployeeList) CreateMap(employeesInfo []employee) {    
    for _ , emp := range employeesInfo {
        e := employee{
            Name : emp.Name,
            Id: emp.Id,
            ManagerId: emp.ManagerId,
        }
        el.employees[emp.Id] = e
        if(emp.ManagerId == 0){
            el.root = e
            fmt.Println("CreateMap",el.root)
        }
    }
    fmt.Println("CreateMap2",el.root,el.employees)
}

func (el *EmployeeList) getReportersById(empId int) []employee {     
    reporters := []employee{}
    for _ , employee := range el.employees {
        if(employee.ManagerId == empId){
            reporters = append(reporters, employee)
        }
    }
    return reporters
}

func (el *EmployeeList) maketree(e *employee) {  
    //e := root
    e.Reporters = el.getReportersById(e.Id)
    if(true){
        fmt.Println("maketree",e.Id,e.Name,e.Reporters)
    }
    // e.Reporters = reporters
    if(len(e.Reporters) == 0){
        return
    }
    for _ , reporterEmployee := range e.Reporters {
        el.maketree(&reporterEmployee);
    }
}

func (el EmployeeList) print(root employee, level int) {     
    for i:= 0; i<level;i++ {
        fmt.Print("\t");
    }
    fmt.Println(root.Name);
    for _, reporter := range root.Reporters {
        el.print(reporter, level + 1)
    }
}

func main() {
    //1. Read JSON File
    myJsonString := `[{    "name": "Rob",    "id": 7,    "managerid": 3 }, {    "name": "Rex",    "id": 6,    "managerid": 2 }, {    "name": "Jake",    "id": 5,    "managerid": 2 }, {    "name": "Paul",    "id": 4,    "managerid": 1 }, {    "name": "Oliver",    "id": 3,    "managerid": 1 }, {    "name": "John",    "id": 2,    "managerid": 1 }, {    "name": "Britney",    "id": 1,    "managerid": 0 }]`
    //2. Create class and sent file data
    emplist := NewEmployeeList()
    rawEmployeesInfo := []employee{}
    
    _ = json.Unmarshal([]byte(myJsonString),&rawEmployeesInfo);
    //fmt.Println(rawEmployeesInfo);
    emplist.CreateMap(rawEmployeesInfo);
    //fmt.Println(emplist.employees,emplist.root);
    fmt.Println("Main1",emplist.root)
    emplist.maketree(&emplist.root);
    //fmt.Println(emplist.root)
    fmt.Println("Main2",emplist.root)
    emplist.print(emplist.root,0)
}

我正在尝试从 json 创建一棵树来存储员工列表。问题是,虽然创建树的值被正确存储,但是当我想打印层次结构树时,它们在主函数中失去了价值。有人可以帮我为什么不存储价值吗?我也添加了日志来检查。

【问题讨论】:

    标签: go recursion data-structures struct tree


    【解决方案1】:

    您的CreateMap 方法:

    func (el EmployeeList) CreateMap(employeesInfo []employee) {
        ...
    }
    

    应该是:

    func (el *EmployeeList) CreateMap(employeesInfo []employee) {
        //---^
        ....
    }
    

    所以el 是一个指针。否则,当您说:

    emplist.CreateMap(rawEmployeesInfo);
    

    所以你做了很多工作来创建你的地图,然后把它扔掉。

    【讨论】:

    • 这可以正常工作,但我在 maketree 中分配的记者也不会保留该值。当我将它登录到maketree时它可以正确打印但是当谈到打印方法时它显示记者是空的?
    • 我也可以通过更改 maketree 函数来使其工作。我不确定这是否是正确的实现,因为我只看到传递给 maketree 的第一个元素的记者。发布了更新的代码。
    • 我也能和记者一起解决这个问题。谢谢@mu-is-too-short
    猜你喜欢
    • 2019-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多