sort
TIP
Se você é um desenvolvedor da versão 1.21 ou superior, recomendo usar a biblioteca padrão slices para ordenação, pois ela suporta genéricos e o design da API é mais razoável.
O pacote sort em Go fornece métodos de ordenação com implementação oficial, a maioria dos quais pode ser usada diretamente. Se quiser ordenar uma struct, é necessário implementar três métodos em sort.Interface: Len(), Swap() e Less(). Como a implementação oficial já nos fornece três tipos Float64Slice, StringSlice e IntSlice, podemos usá-los diretamente sem precisar implementar nós mesmos.
type Interface interface {
// Método de comprimento
Len() int
// Método de comparação
Less(i, j int) bool
// Método de troca
Swap(i, j int)
}Ordenação de Inteiros
func main() {
ints := []int{1, 2, 3, 111, 5, 99, 23, 5, 66}
sort.Ints(ints)
}Ordenação de Ponto Flutuante
func main() {
floats := []float64{1.0, 2.5, 3.8, 1.11, 5.5, 99.99999, 23.9999, 5.66, 66}
sort.Float64s(floats)
fmt.Println(floats)
}Ordenação de Strings
func main() {
strings := []string{"helloworld", "aaa", "bbb", "ccc"}
sort.Strings(strings)
}Ordenação Inversa
É necessário empacotar com sort.Reverse antes de ordenar:
func main() {
floats := []float64{1.0, 2.5, 3.8, 1.11, 5.5, 99.99999, 23.9999, 5.66, 66}
sort.Sort(sort.Reverse(sort.Float64Slice(floats)))
fmt.Println(floats)
}Ordenação Personalizada
Se quiser ordenar uma struct personalizada, é necessário implementar três métodos:
type Person struct {
UserId string
Username string
Age int
Address string
}
type PersonSlice []Person
// Retorna o comprimento do slice
func (p PersonSlice) Len() int {
return len(p)
}
// Método de comparação
func (p PersonSlice) Less(i, j int) bool {
return p[i].Age < p[j].Age
}
// Método de troca
func (p PersonSlice) Swap(i, j int) {
p[i], p[j] = p[j], p[i]
}Como a comparação é baseada na idade, o resultado será ordenado de acordo com a idade.
func main() {
persons := []Person{{
UserId: "1",
Username: "wyh",
Age: 18,
Address: "us",
}, {
UserId: "2",
Username: "jack",
Age: 17,
Address: "ch",
}, {
UserId: "3",
Username: "mike",
Age: 15,
Address: "india",
}}
sort.Sort(PersonSlice(persons))
fmt.Println(persons)
}Verificar se está Ordenado
Verifica se um slice está ordenado. Internamente não realiza operação de ordenação, mas usa chamadas de loop ao método Less() para verificar:
func main() {
persons := []Person{{
UserId: "1",
Username: "wyh",
Age: 18,
Address: "us",
}, {
UserId: "2",
Username: "jack",
Age: 17,
Address: "ch",
}, {
UserId: "3",
Username: "mike",
Age: 15,
Address: "india",
}}
sort.Sort(PersonSlice(persons))
println(sort.IsSorted(PersonSlice(persons)))
}