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]. ...

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");
    }
}

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.


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

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.


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.
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.