eliminar mapa [clave] en ir?

166

Tengo un mapa:

var sessions =  map[string] chan int{}

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

sessions[key] = nil,false;

Eso no funcionó.


Actualización (noviembre de 2011):

La sintaxis especial para eliminar entradas de mapas se elimina en Go versión 1 :

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

jonaz
fuente

Respuestas:

154

Curiosamente,

package main

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

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

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

package main

func main () {
    var sessions = map[string] chan int{};
    sessions["moo"] = make (chan int);
    _, ok := sessions["moo"];
    if ok {
        delete(sessions, "moo");
    }
}
coolaj86
fuente
Mirar hacia arriba el valor y la reutilización debe ser más barato: sessions["moo"] = sessions["moo"], false;(? O es que mal)
u0b34a0f6ae
Eso se bloquea a menos que la clave esté presente. He agregado otra solución basada en tu idea.
1
¿Es seguro usarlo para determinar el mapa en sí?
Jorge Ramirez
@JorgeRamirez, no lo creo. si desea hacer eso, encuentre una manera de iterar sobre una porción de las teclas en lugar del objeto del mapa en sí mismo
Seaux
55
¿Por qué la segunda solución es un mejor uso de los recursos? En la segunda solución, realiza dos búsquedas clave, mientras que en la primera solución, realiza una búsqueda clave.
thebiggestlebowski
86

Copiado de las notas de la versión Go 1

En el idioma anterior, para eliminar la entrada con clave kdel mapa representado por m, se 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 valor booleano que casi siempre era la constante falsa. Hizo el trabajo pero era extraño y un punto de discusión.

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 del mapa recuperada por la expresión m[k]. No hay valor de retorno. Eliminar una entrada inexistente es un no-op.

Actualización: la ejecución go fixconvertirá expresiones del formulario m[k] = value, falseen delete(m, k)cuando esté claro que el valor ignorado se puede descartar de forma segura del programa y se falserefiere a la constante booleana predefinida. La herramienta de reparación marcará otros usos de la sintaxis para la inspección del programador.

hannson
fuente
54

De Go eficaz :

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

delete(timeZone, "PDT")  // Now on Standard Time
György Andrasek
fuente
sessions.go:6: cannot use 0 (type int) as type chan int
3
@Kinopiko: No creo que Jurily quisiera que el OP usara ese fragmento de código. Él solo copió un ejemplo de los documentos.
Isaías el
2
Parece que esto se ha eliminado desde entonces, obteniendoassignment count mismatch: 1 = 2 (use delete)
ghayes
0

Usar en make (chan int)lugar de nil. El primer valor tiene que 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.

Isaias
fuente
sessions.go:6: cannot use 0 (type int) as type chan int
Vaya, olvidé que también lo eliminé: P
Isaías el
package main func main () {var sessions = map[string] chan int{};sessions["moo"] = make (chan int);}
Lo anterior se compila y se ejecuta en mi versión de Go.