Tree value being lost in implementation

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 {
		fmt.Println("Enter");
		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)
}

While running the code the value for the tree is lost before printing the contents of the tree. Can someone please let me know what is wrong?

You are passing el*EmployeeList as value receiver. That means goalng creates a local copy and makes changes en that local copy.
Just change to a pointer receiver and your are done
func (el *EmployeeList) CreateMap(employeesInfo []employee) {…

This topic was automatically closed 90 days after the last reply. New replies are no longer allowed.