Aunque esta es una vieja pregunta, me gustaría señalar el paquete github.com/bradfitz/slice
. Pero como un ejemplo o prueba de concepto único, me no recomendar esta realidad ser utilizado (se documenta con la palabra "bruto"):
Utiliza operaciones, de bajo nivel bruto para hacer más fácil para ordenar sectores arbitrarios con solo una función menor, sin definir un nuevo tipo con operaciones Len e Intercambiar.
En código real, creo que es completamente trivial, rápido y corto, fácil de leer, y no distraer a simplemente hacer algo como:
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
}
Aquí gofmt
insiste en una línea en blanco entre el type
y func
líneas pero no tiene ningún problema con múltiples funciones de una línea sin líneas en blanco y alinea muy bien los cuerpos de las funciones. Me parece una buena forma compacta legible para tales cosas.
En cuanto a su comentario de que:
Parece que Len y de intercambio siempre deben tener la misma aplicación sin importar el tipo de estructura se encuentra en la [rebanada]
simplemente la otra semana necesito una especie que mantuvo pares de elementos en una rebanada juntos (para entrada a strings.NewReplacer
) que requiere una variación trivial como:
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]
}
Esto no es compatible con una interfaz como la de github.com/bradfitz/slice
. Una vez más, considero que este diseño es fácil, compacto y legible. Aunque (tal vez más en este caso), otros pueden estar en desacuerdo.
muy interesante. Me había preguntado cómo usar múltiples géneros en el mismo tipo de corte. –