Golang sortfunc
Ordenando Slices
Em Go, ordernar um slice é frequentemente necessário quando estamos trabalhando com dados que precisam ser organizados ou estruturados para uma melhor usabilidade, eficiência, ou apresentação. Aqui estão alguns cenários onde você pode precisar ordenar um slice.
Exibindo dados ordenados
Melhorar a eficiência de uma busca
Customizar um Ranking ou Priorização
Limpeza de dados e Organização
Função SortFunc
Para ordenar um slice nós podemos utilizar a função slices.SortFunc.
A função slices.SortFunc recebe um slice e uma função de comparação para ordenar os values.
Essa função de comparação retorna -1 se a < b, 1 se a > b e 0 se os valores forem iguais.
var mySlice []string
mySlice = append(mySlice, "A")
mySlice = append(mySlice, "B")
mySlice = append(mySlice, "C")
mySlice = append(mySlice, "Z")
mySlice = append(mySlice, "M")
mySlice = append(mySlice, "Y")
mySlice = append(mySlice, "P")
slices.SortFunc(mySlice, func(a, b string) int {
return strings.Compare(a, b)
})
for _, v := range mySlice {
fmt.Println(v)
}
>>> A
>>> B
>>> C
>>> M
>>> P
>>> Y
>>> Z
Se nós quisermos ordernar um slice de inteiros, nós podemos alterar a função dessa maneira:
var mySlice []int
mySlice = append(mySlice, 55)
mySlice = append(mySlice, 53)
mySlice = append(mySlice, 105)
mySlice = append(mySlice, 3)
mySlice = append(mySlice, 375)
mySlice = append(mySlice, 376)
mySlice = append(mySlice, 377)
mySlice = append(mySlice, 250)
mySlice = append(mySlice, 15)
slices.SortFunc(mySlice, func(a, b int) int {
return a - b
})
for _, v := range mySlice {
fmt.Println(v)
}
>>> 3
>>> 15
>>> 53
>>> 55
>>> 105
>>> 250
>>> 375
>>> 376
>>> 377
Ordenando um mapa
Se nós precisarmos ordenar um map, nós podemos criar uma struct para armazenar os valores do map, e então nós podemos ordenar o slice dessa struct.
package main
import (
"fmt"
"slices"
"strings"
)
func main() {
fmt.Println("Starting")
var myMap = map[string]int{
"G": 7,
"B": 2,
"C": 3,
"E": 5,
"A": 1,
"D": 4,
"H": 8,
"F": 6,
}
type kv struct {
Key string
Value int
}
var kvSlice []kv
for k, v := range myMap {
kvSlice = append(kvSlice, kv{Key: k, Value: v})
}
for k, v := range kvSlice {
fmt.Println(k, v)
}
fmt.Println("----------")
slices.SortFunc(kvSlice, func(a, b kv) int {
return strings.Compare(a.Key, b.Key)
})
for k, v := range kvSlice {
fmt.Println(k, v)
}
}
>>> 55
>>> 53
>>> 105
>>> 3
>>> 375
>>> 376
>>> 377
>>> 250
>>> 15
>>> ----------
>>> 3
>>> 15
>>> 53
>>> 55
>>> 105
>>> 250
>>> 375
>>> 376
>>> 377