dictionary ¿Cómo comprobar si un mapa contiene una clave en ir?



5 Answers

Edición: la siguiente respuesta es anterior a Go 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 obtener un valor de mapa con una clave que no está presente en el mapa hará que el programa se bloquee, pero hay una manera de hacerlo de manera segura utilizando una asignación múltiple".

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

"Para probar la presencia en el mapa sin preocuparse por el valor real, puede usar el identificador en blanco, un subrayado simple (_). El identificador en blanco se puede asignar o declarar con cualquier valor de cualquier tipo, con el valor descartado sin causar daños. Para probar la presencia en un mapa, use el identificador en blanco en lugar de la variable habitual para el valor ".

_, present := timeZone[tz]
dictionary go

Sé que puedo recorrer un mapa m,

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

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




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

Por la sección de 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 enteros, buscar una clave no existente devolverá 0.

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

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

Por razones obvias, esto se llama el idioma "coma bien". En este ejemplo, si tz está presente, los segundos se establecerán adecuadamente y ok será cierto; Si no, los segundos se establecerán en cero y ok será falso. Aquí hay una función que lo pone junto con un buen informe de errores:

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

Para probar 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]



mejor camino aquí

if _, ok := dict["foo"]; ok {
    //do something here
}



    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 correr maps.go existe alguna cosa? verdad no existe? falso




Solo usa

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





Related