street over obelisco google golang espaƱol earth map go

over - maps maps



eliminar mapa[tecla] en go? (5)

Tengo un mapa:

var sessions = map[string] chan int{}

¿Cómo elimino sessions[key] ? Lo intenté:

sessions[key] = nil,false;

Eso no funcionó.

Actualización (noviembre de 2011):

La sintaxis especial para eliminar las entradas del mapa se elimina en la versión 1 de Go :

Ir 1 eliminará la asignación de mapa especial e introducirá una nueva función incorporada, delete : delete(m, x) eliminará la entrada de mapa recuperada por la expresión m[x] . ...


Copiado de notas de la versión de Go 1

En el idioma antiguo, para eliminar la entrada con la tecla k del mapa k , uno escribió la declaración,

m[k] = value, false

Esta sintaxis era un caso especial peculiar, la única asignación de dos a uno. Se requería pasar un valor (generalmente ignorado) que se evalúa pero se descarta, más un booleano que casi siempre era la constante falsa. Hizo el trabajo, pero fue extraño y un punto de discordia.

En Go 1, esa sintaxis se ha ido; en su lugar, hay una nueva función incorporada, delete . La llamada

delete(m, k)

eliminará la entrada de mapa recuperada por la expresión m[k] . No hay valor de retorno Eliminar una entrada inexistente es un no-op.

Actualización: ejecutar go fix convertirá las expresiones de la forma m[k] = value, false en delete(m, k) cuando esté claro que el valor ignorado puede descartarse de manera segura del programa y false refiere a la constante booleana predefinida. La herramienta de corrección marcará otros usos de la sintaxis para su inspección por el programador.


Curiosamente,

package main func main () { var sessions = map[string] chan int{}; delete(sessions, "moo"); }

parece funcionar. ¡Sin embargo, esto parece un mal uso de los recursos!

Otra forma es verificar la existencia y usar el valor en sí mismo:

package main func main () { var sessions = map[string] chan int{}; sessions["moo"] = make (chan int); _, ok := sessions["moo"]; if ok { delete(sessions, "moo"); } }


De Effective Go :

Para eliminar una entrada de mapa, use la función eliminada incorporada, cuyos argumentos son el mapa y la clave que se eliminará. Es seguro hacer esto incluso si la clave ya está ausente del mapa.

delete(timeZone, "PDT"); // Now on Standard Time


Use make (chan int) lugar de nil . El primer valor debe ser del mismo tipo que su mapa.

package main import "fmt" func main() { var sessions = map[string] chan int{} sessions["somekey"] = make(chan int) fmt.Printf ("%d/n", len(sessions)) // 1 // Remove somekey''s value from sessions delete(sessions, "somekey") fmt.Printf ("%d/n", len(sessions)) // 0 }

ACTUALIZACIÓN: corrigió mi respuesta.


delete(sessions, "anykey")

En estos días, nada se bloqueará.