golang 为什么在实现层次结构树时会覆盖值?

golang why is value overwritten while implementing hierarchy tree?

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 创建一个树来存储员工列表。问题是在创建树时值被正确存储但是当我想打印层次结构树时它们在主函数中以某种方式丢失了值。有人可以帮我为什么不存储值吗?我也添加了日志来检查。

你的CreateMap方法:

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

应该是:

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

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

时,您正在对 emplist 的副本进行操作
emplist.CreateMap(rawEmployeesInfo);

所以你做了大量的工作来创建你的地图,然后把它全部扔掉。