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ónm[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á.