página - google maps api key gratis
Obtener una clave/elemento arbitrario de un mapa (3)
Soy nuevo en Golang y ahora quiero obtener un elemento arbitrario de un mapa, ¿cuál es la forma idiomática de hacerlo? Sólo puedo pensar en algo como a continuación:
func get_some_key(m map[int]int) int {
for k := range m {
return k
}
return 0
}
La razón por la que quiero eso es que estoy usando un mapa para mantener un conjunto de trabajos y con un mapa puedo obtener un trabajo pendiente o eliminar un trabajo terminado en O (1). Supongo que esto debería ser un requisito común, pero no es obvio hacerlo en marcha.
¡Gracias por adelantado!
Aquí hay una versión más genérica, aunque puede ser menos eficiente:
keys := reflect.ValueOf(mapI).MapKeys()
return keys[rand.Intn(len(keys))].Interface()
Obtener una clave aleatoria de un mapa solo implica un segundo contador como un número aleatorio.
// choices = map[string]...
i := rand.Intn(len(choices))
var k string
for k = range choices {
if i == 0 {
break
}
i--
}
fmt.Println(k, choices[k])
El mapa puede tener cualquier tipo de clave válida y solo necesita cambiar la var k string
para que coincida. Puedes empaquetar esto como una función:
func randIntMapKey(m map[int]string) int {
i := rand.Intn(len(m))
for k := range m {
if i == 0 {
return k
}
i--
}
panic("never")
}
Se puede discutir si obtener una clave arbitraria de una tabla hash es un requisito común. La implementación de otros mapas de idiomas a menudo carece de esta función (por ejemplo, Diccionario en C # )
Sin embargo, su solución es probablemente la más rápida, pero se quedará con un algoritmo pseudoaleatorio que no controla. Y mientras que la implementación actual utiliza un algoritmo pseduo-aleatorio, la especificación Go no le da ninguna seguridad de que en realidad será aleatoria, solo que no se garantiza que sea predecible:
El orden de iteración sobre los mapas no se especifica y no se garantiza que sea el mismo de una iteración a la siguiente.
Si desea más control de la aleatorización, también puede mantener en paralelo una porción actualizada de valores (o claves) contenida en el mapa, utilizando la aleatorización de su elección ( math/rand
o crypto/rand
para casos más extremos) para obtener el valor almacenado en un índice, seleccionado aleatoriamente, en el segmento.