Model Go: Sortarea unui slice după mai multe chei
- 1 minute de citit
- 4 exemple de cod
Disponibil și în English
Pe această pagină
Salut 👋
În acest articol vreau să prezint un model simplu pentru sortarea unui slice în Go după mai multe chei.
Să presupunem că avem următoarea structură și vrem să o sortăm crescător după Version, Generation și Time.
type TheStruct struct { Generation int Time int Version int}Modul în care sortăm slice-uri în Go este folosind interfața sort sau una dintre funcțiile sort.Slice. Pentru a sorta slice-ul după criteriile de mai sus vom apela sort.Slice cu următoarea funcție.
sort.Slice(structs, func(i, j int) bool { iv, jv := structs[i], structs[j] switch { case iv.Version != jv.Version: return iv.Version < jv.Version case iv.Generation != jv.Generation: return iv.Generation < jv.Generation default: return iv.Time < jv.Time } })Slice-ul va fi sortat după următoarele câmpuri: Version, Generation și Time. Trucul este instrucțiunea switch și expresia case case iv.Version != jv.Version, urmată de instrucțiunea return iv.Version < jv.Version.
Puteți folosi acest model ori de câte ori doriți să sortați slice-uri după mai multe câmpuri în Go.
Mulțumesc pentru lectură! 🍻
Cod sursă
package mainimport ( "fmt" "sort")type TheStruct struct { Generation int Time int Version int}func main() { var structs = []TheStruct{ { Generation: 1, Time: 150, Version: 0, }, { Generation: 1, Time: 200, Version: 0, }, { Generation: 1, Time: 200, Version: 2, }, { Generation: 1, Time: 500, Version: 0, }, { Generation: 1, Time: 100, Version: 0, }, { Generation: 1, Time: 400, Version: 0, }, { Generation: 2, Time: 400, Version: 0, }, { Generation: 2, Time: 100, Version: 2, }, { Generation: 1, Time: 300, Version: 0, }, } fmt.Printf("%v\n", structs) sort.Slice(structs, func(i, j int) bool { iv, jv := structs[i], structs[j] switch { case iv.Version != jv.Version: return iv.Version < jv.Version case iv.Generation != jv.Generation: return iv.Generation < jv.Generation default: return iv.Time < jv.Time } }) fmt.Printf("%v\n", structs)}Rezultat
[{1 150 0} {1 200 0} {1 200 2} {1 500 0} {1 100 0} {1 400 0} {2 400 0} {2 100 2} {1 300 0}][{1 100 0} {1 150 0} {1 200 0} {1 300 0} {1 400 0} {1 500 0} {2 400 0} {1 200 2} {2 100 2}]Mulțumiri speciale și lui RP.💖