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.💖