I have the following Structs:
type Parent struct {
id string
children []Child
}
type Child struct {
id string
}
I have made a slice of Parents with the following values:
parents := make([]Parent, 0)
p1 := Parent {
"3",
[]Child {
{"2"},
{"3"},
{"1"},
},
}
p2 := Parent {
"1",
[]Child {
{"8"},
{"9"},
{"7"},
},
}
p3 := Parent {
"2",
[]Child {
{"5"},
{"6"},
{"4"},
},
}
parents = append(parents, p1, p2, p3)
I am trying to sort the "parents" slice in the following order:
1) First, sort all Parents by Parent.id
2) Next, sort each Parent's "children" slice by Child.id
The expected result is something like:
[{1 [{7} {8} {9}]} {2 [{4} {5} {6}]} {3 [{1} {2} {3}]}]
Is there a way to do this in Go?
Use the function sort. Slice . It sorts a slice using a provided function less(i, j int) bool . To sort the slice while keeping the original order of equal elements, use sort.
In Go language, you can sort a slice with the help of Slice() function. This function sorts the specified slice given the provided less function. The result of this function is not stable. So for stable sort, you can use SliceStable.
I got it to work using the following code:
// sort each Parent in the parents slice by Id
sort.Slice(parents, func(i, j int) bool {return parents[i].id < parents[j].id})
// for each Parent, sort each Child in the children slice by Id
for _, parent := range parents {
sort.Slice(parent.children, func(i, j int) bool {return parent.children[i].id < parent.children[j].id})
}
Special thanks to @Volker for mentioning the sort.Slice function! I had no idea it existed!
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With