excluir mapa [chave] em go?

166

Eu tenho um mapa:

var sessions =  map[string] chan int{}

Como eu apago sessions[key]? Eu tentei:

sessions[key] = nil,false;

Isso não funcionou.


Atualização (novembro de 2011):

A sintaxe especial para excluir entradas do mapa é removida na versão 1 do Go :

O Go 1 removerá a atribuição especial de mapa e apresentará uma nova função interna delete:: delete(m, x)excluirá a entrada de mapa recuperada pela expressão m[x]. ...

jonaz
fonte

Respostas:

154

Estranhamente,

package main

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

parece funcionar. Parece um uso insuficiente de recursos!

Outra maneira é verificar a existência e usar o próprio valor:

package main

func main () {
    var sessions = map[string] chan int{};
    sessions["moo"] = make (chan int);
    _, ok := sessions["moo"];
    if ok {
        delete(sessions, "moo");
    }
}
coolaj86
fonte
Olhando para cima o valor ea reutilização deve ser mais barato: sessions["moo"] = sessions["moo"], false;(? Ou é que errado)
u0b34a0f6ae
Isso trava, a menos que a chave esteja presente. Adicionei outra solução com base na sua ideia.
1
É seguro usá-lo enquanto varia o próprio mapa?
Jorge Ramirez
@JorgeRamirez eu não acredito nisso. se você quiser fazer isso encontrar uma maneira para iterar sobre uma fatia das chaves em vez do próprio objeto mapa
Seaux
5
Por que a segunda solução é uma melhor utilização dos recursos? Na segunda solução, você faz duas pesquisas principais, enquanto na primeira solução, você faz uma pesquisa principal.
thebiggestlebowski
86

Copiado das notas de versão do Go 1

No idioma antigo, para excluir a entrada com a chave kdo mapa representado por m, escreveu-se a declaração,

m[k] = value, false

Essa sintaxe era um caso especial e peculiar, a única tarefa de dois para um. Exigia passar um valor (geralmente ignorado) que é avaliado mas descartado, além de um booleano que quase sempre era a constante falsa. Ele fez o trabalho, mas foi estranho e um ponto de discórdia.

No Go 1, essa sintaxe desapareceu; em vez disso, há uma nova função interna delete,. A chamada

delete(m, k)

excluirá a entrada do mapa recuperada pela expressão m[k]. Não há reembolso. Excluir uma entrada inexistente não é uma opção.

Atualização: A execução go fixconverterá expressões do formulário m[k] = value, falseem delete(m, k)quando estiver claro que o valor ignorado pode ser descartado com segurança do programa e falsese refere à constante booleana predefinida. A ferramenta de correção sinalizará outros usos da sintaxe para inspeção pelo programador.

hannson
fonte
54

Do Effective Go :

Para excluir uma entrada de mapa, use a função interna delete, cujos argumentos são o mapa e a chave a ser excluída. É seguro fazer isso mesmo que a chave já esteja ausente no mapa.

delete(timeZone, "PDT")  // Now on Standard Time
György Andrasek
fonte
sessions.go:6: cannot use 0 (type int) as type chan int
3
@ Kinopiko: Eu não acho que Jurily quis dizer que o OP usasse esse trecho de código. Ele apenas copiou um exemplo dos documentos.
Isaías
2
Parece que isso foi removido desde então, ficandoassignment count mismatch: 1 = 2 (use delete)
ghayes
0

Use em make (chan int)vez de nil. O primeiro valor deve ser do mesmo tipo que o seu mapa contém.

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
}

UPDATE: Corrigida minha resposta.

Isaías
fonte
sessions.go:6: cannot use 0 (type int) as type chan int
Opa, se esqueceu de que I removido que também: P
Is
package main func main () {var sessions = map[string] chan int{};sessions["moo"] = make (chan int);}
O acima compila e roda na minha versão do Go.