package main
import (
"fmt"
)
type entity struct {
id int
parentId *int
children []entity
}
type response struct {
data []entity
}
func main() {
resp := response{}
one := 1
two := 2
entities := map[int]entity{
1: {id: 1, parentId: nil},
2: {id: 2, parentId: &one},
3: {id: 3, parentId: &two},
}
for _, entity := range entities {
if entity.parentId != nil {
fmt.Println("adding", *entity.parentId, "to", entity.id)
parent := entities[*entity.parentId]
parent.children = append(parent.children, entity)
entities[*entity.parentId] = parent
}
}
fmt.Println("entities[1].children len", len(entities[1].children)) // 1
fmt.Println("entities[2].children len", len(entities[2].children)) // 1
fmt.Println("entities[3].children len", len(entities[3].children)) // 0
resp.data = append(resp.data, entities[1])
fmt.Println("resp.data[0].id", resp.data[0].id) // 1
fmt.Println("resp.data[0].children len", len(resp.data[0].children)) // 1
fmt.Println("resp.data[0].children[0].id", resp.data[0].children[0].id) // 2
fmt.Println("resp.data[0].children[0].children len", len(resp.data[0].children[0].children)) // expected 1, got 0, sometimes 1
}
the only difference between valid and invalid runs is the order in which entity parents were assigned, wat do