Anche se questa è una vecchia questione, vorrei sottolineare il pacchetto github.com/bradfitz/slice
. ma come esempio o la prova di un solo concetto, vorrei non raccomandare questo effettivamente utilizzato (è documentato con la parola "lordo"):
Esso utilizza le operazioni, di basso livello lordo per rendere più facile per ordinare fette arbitrarie con solo una funzione in meno, senza definire un nuovo tipo con le operazioni Len e Swap.
Nel codice vero e proprio, lo trovo del tutto banale, rapido, breve, leggibile, e non distrae per fare proprio qualcosa di simile:
type points []point
func (p []points) Len() int { return len(p) }
func (p []points) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
func (p []points) Less(i, j int) bool {
// custom, often multi-line, comparison code here
}
Qui gofmt
insiste su una riga vuota tra il type
e func
righe ma non ha problemi con più funzioni a una riga senza righe vuote e allinea correttamente i corpi delle funzioni. Trovo che questo sia un bel modulo compatto leggibile per queste cose.
quanto riguarda il tuo commento che:
Sembra che Len e swap dovrebbe sempre avere la stessa implementazione non importa il tipo di struct è nel [slice]
appena l'altra settimana ho bisogno di una specie che teneva coppie di elementi in una fetta insieme (per ingresso a strings.NewReplacer
) che ha richiesto una variazione banale come:
type pairByLen []string
func (p pairByLen) Len() int { return len(p)/2 }
func (p pairByLen) Less(i, j int) bool { return len(p[i*2]) > len(p[j*2]) }
func (p pairByLen) Swap(i, j int) {
p[i*2], p[j*2] = p[j*2], p[i*2]
p[i*2+1], p[j*2+1] = p[j*2+1], p[i*2+1]
}
Questo non è supportato da un'interfaccia come quella di github.com/bradfitz/slice
. Ancora una volta, trovo questo layout facile, compatto e leggibile. Anche se (forse di più in questo caso), altri potrebbero non essere d'accordo.
Molto interessante. Mi sono chiesto come utilizzare più ordinamenti sullo stesso tipo di Slice. –