go

Golang: obtener un trozo de teclas de un mapa



(4)

¿Hay alguna manera más simple / más agradable de obtener un trozo de claves de un mapa en Ir?

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++ }


Esta es una vieja pregunta, pero aquí están mis dos centavos. La respuesta de PeterSO es un poco más conciso, pero ligeramente menos eficiente. Ya sabes lo grande que va a ser así que ni siquiera necesitas usar append:

keys := make([]int, len(mymap)) i := 0 for k := range mymap { keys[i] = k i++ }

En la mayoría de las situaciones, probablemente no suponga una gran diferencia, pero no es mucho más trabajo, y en mis pruebas (al usar un mapa con 1.000.000 de claves int64 aleatorias y luego generar la matriz de claves diez veces con cada método), fue aproximadamente un 20% más rápido para asignar miembros de la matriz directamente que para usar append.

Aunque establecer la capacidad elimina las reasignaciones, anexar todavía tiene que hacer un trabajo extra para verificar si ha alcanzado la capacidad en cada anexión.


Por ejemplo,

package main func main() { mymap := make(map[int]string) keys := make([]int, 0, len(mymap)) for k := range mymap { keys = append(keys, k) } }

Para ser eficiente en Go, es importante minimizar las asignaciones de memoria.


También puede tomar una matriz de claves con el tipo []Value por método MapKeys de struct Value del paquete " MapKeys ":

package main import ( "fmt" "reflect" ) func main() { abc := map[string]int{ "a": 1, "b": 2, "c": 3, } keys := reflect.ValueOf(abc).MapKeys() fmt.Println(keys) // [a b c] }


Una forma más agradable de hacer esto sería usar append :

keys = []int{} for k := range mymap { keys = append(keys, k) }

Aparte de eso, no tienes suerte: Go no es un lenguaje muy expresivo.