[dictionary] ¿Cómo verificar si un mapa contiene una clave en go?


Answers

Editar: la siguiente respuesta es anterior a Ir 1. Comenzando con Go 1, ya no es precisa / válida.

Además de la especificación del lenguaje de programación The Go , debe leer Effective Go . En la sección de maps , dicen, entre otras cosas:

"Un intento de recuperar un valor del mapa con una clave que no está presente en el mapa hará que el programa falle, pero hay una forma de hacerlo de manera segura usando una asignación múltiple".

var seconds int
var ok bool
seconds, ok = timeZone[tz]

"Para comprobar la presencia en el mapa sin preocuparse por el valor real, puede usar el identificador en blanco, un guión bajo simple (_). El identificador en blanco se puede asignar o declarar con cualquier valor de cualquier tipo, con el valor descartado inofensivamente. Para probar la presencia en un mapa, utilice el identificador en blanco en lugar de la variable habitual para el valor ".

_, present := timeZone[tz]
Question

Sé que puedo iterar sobre un mapa m,

for k, v := range m { ... }

y busca una clave, pero ¿hay alguna manera más eficiente de probar la existencia de una clave en un mapa? Gracias. No pude encontrar una respuesta en la especificación del idioma .




Solo usa

if len(m) == 0 {
    ...
}



Respuesta corta

_, exists := timeZone[tz]    // Just checks for key existence
val, exists := timeZone[tz]  // Checks for key existence and retrieves the value

Ejemplo

Aquí hay un ejemplo en el Go Playground .

Respuesta más larga

Según la sección Maps de Maps :

Un intento de obtener un valor de mapa con una clave que no está presente en el mapa devolverá el valor cero para el tipo de las entradas en el mapa. Por ejemplo, si el mapa contiene números enteros, buscar una clave que no exista devolverá 0.

A veces necesita distinguir una entrada faltante de un valor cero. ¿Hay una entrada para "UTC" o es la cadena vacía porque no está en el mapa? Puede discriminar con una forma de asignación múltiple.

var seconds int
var ok bool
seconds, ok = timeZone[tz]

Por razones obvias, esto se conoce como el modismo "coma bien". En este ejemplo, si tz está presente, los segundos se establecerán apropiadamente y la respuesta correcta será verdadera; si no, los segundos se establecerán en cero y ok será falso. Aquí hay una función que lo une con un buen informe de error:

func offset(tz string) int {
    if seconds, ok := timeZone[tz]; ok {
        return seconds
    }
    log.Println("unknown time zone:", tz)
    return 0
}

Para comprobar la presencia en el mapa sin preocuparse por el valor real, puede usar el identificador en blanco (_) en lugar de la variable habitual para el valor.

_, present := timeZone[tz]



    var empty struct{}
    var ok bool
    var m map[string]struct{}
    m = make(map[string]struct{})
    m["somestring"] = empty


    _, ok = m["somestring"]
    fmt.Println("somestring exists?", ok) 
    _, ok = m["not"]
    fmt.Println("not exists?", ok)

Entonces, ve a ejecutar maps.go ¿existe alguna cadena? cierto no existe? falso




Links