¿Hay alguna forma más simple / mejor de obtener una porción de claves de un mapa en Go?
Actualmente estoy iterando sobre el mapa y copiando las claves en un segmento:
i := 0
keys := make([]int, len(mymap))
for k := range mymap {
keys[i] = k
i++
}

Respuestas:
Por ejemplo,
Para ser eficiente en Go, es importante minimizar las asignaciones de memoria.
fuente
mymapno es una variable local (y, por lo tanto, está sujeta a crecimiento / reducción), esta es la única solución adecuada: garantiza que si el tamaño de losmymapcambios entre la inicialización dekeysy elforbucle, no habrá ninguna salida. problemas de límites.Esta es una vieja pregunta, pero aquí están mis dos centavos. La respuesta de PeterSO es un poco más concisa, pero un poco menos eficiente. Ya sabes lo grande que será, así que ni siquiera necesitas usar append:
En la mayoría de las situaciones, probablemente no hará mucha diferencia, pero no es mucho más trabajo, y en mis pruebas (usando un mapa con 1,000,000
int64claves aleatorias y luego generando la matriz de claves diez veces con cada método), se trataba de 20% más rápido para asignar miembros de la matriz directamente que para usar append.Si bien establecer la capacidad elimina las reasignaciones, append todavía tiene que hacer un trabajo adicional para verificar si ha alcanzado la capacidad en cada anexo.
fuente
for i, k := range mymap{? De esa manera no necesitas el i ++?i, k := range mymap, entoncesiserán claves ykserán valores correspondientes a esas claves en el mapa. En realidad, eso no te ayudará a llenar una porción de claves.También puede tomar una matriz de claves con tipo
[]Valuepor métodoMapKeysde estructuraValuedel paquete "reflect":fuente
[]string?Una mejor manera de hacer esto sería usar
append:Aparte de eso, no tienes suerte: Go no es un lenguaje muy expresivo.
fuente
keys = make([]int, 0, len(mymap))se eliminarán las asignaciones, pero espero que aún sea más lento.Hice un punto de referencia incompleto sobre los tres métodos descritos en otras respuestas.
Obviamente, preasignar el segmento antes de tirar de las teclas es más rápido que
appending, pero sorprendentemente, elreflect.ValueOf(m).MapKeys()método es significativamente más lento que el último:Aquí está el código: https://play.golang.org/p/Z8O6a2jyfTH (ejecutarlo en el patio de juegos aborta alegando que lleva demasiado tiempo, así que, bueno, ejecútelo localmente).
fuente
keysAppendfunción, puede establecer la capacidad de lakeysmatriz conmake([]uint64, 0, len(m)), lo que cambió drásticamente el rendimiento de esa función para mí.Visita https://play.golang.org/p/dx6PTtuBXQW
fuente