cancellare la mappa [chiave] in go?


166

Ho una mappa:

var sessions =  map[string] chan int{}

Come cancello sessions[key]? Provai:

sessions[key] = nil,false;

Non ha funzionato.


Aggiornamento (novembre 2011):

La sintassi speciale per l'eliminazione delle voci della mappa è stata rimossa in Go versione 1 :

Vai 1 rimuoverà l'assegnazione speciale mappa e introdurre una nuova funzione built-in, delete: delete(m, x)sarà eliminare la voce carta recuperata con l'espressione m[x]. ...

Risposte:


154

Abbastanza strano,

package main

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

sembra funzionare. Questo sembra però un cattivo uso delle risorse!

Un altro modo è verificare l'esistenza e utilizzare il valore stesso:

package main

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

Cercare il valore e riutilizzarlo deve essere più economico: sessions["moo"] = sessions["moo"], false;(o è sbagliato?)
— u0b34a0f6ae

Questo si blocca a meno che non sia presente la chiave. Ho aggiunto un'altra soluzione in base alla tua idea.

1
È sicuro da usare durante il for-range della mappa stessa?
— Jorge Ramirez,

@JorgeRamirez non ci credo. se vuoi farlo, trova un modo per scorrere su una fetta delle chiavi invece dell'oggetto mappa stesso
— Seaux,

6
Perché la seconda soluzione è un migliore utilizzo delle risorse? Nella seconda soluzione si eseguono due ricerche chiave, mentre nella prima soluzione si esegue una ricerca chiave.
— thebiggestlebowski il

86

Copiato dalle note di rilascio di Go 1

Nella vecchia lingua, per eliminare la voce con chiave kdalla mappa rappresentata da m, si scriveva la dichiarazione,

m[k] = value, false

Questa sintassi era un caso particolare peculiare, l'unico incarico due a uno. Richiedeva il passaggio di un valore (generalmente ignorato) che veniva valutato ma scartato, oltre a un valore booleano che era quasi sempre il falso costante. Ha fatto il lavoro ma era strano e un punto di contesa.

In Go 1, quella sintassi è andata; invece c'è una nuova funzione incorporata, delete. La chiamata

delete(m, k)

eliminerà la voce della mappa recuperata dall'espressione m[k]. Non esiste un valore di ritorno. L'eliminazione di una voce inesistente non è consentita.

Aggiornamento: In esecuzione go fixconvertirà le espressioni del modulo m[k] = value, falsein delete(m, k)quando è chiaro che il valore ignorato può essere scartato in modo sicuro dal programma e si falseriferisce alla costante booleana predefinita. Lo strumento di correzione indicherà altri usi della sintassi per l'ispezione da parte del programmatore.


55

Da Go efficace :

Per eliminare una voce della mappa, utilizzare la funzione integrata di eliminazione, i cui argomenti sono la mappa e la chiave da eliminare. È sicuro farlo anche se la chiave è già assente dalla mappa.

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

sessions.go:6: cannot use 0 (type int) as type chan int

3
@Kinopiko: Non credo che Jurily intendesse utilizzare l'OP per quel frammento di codice. Ha appena copiato un esempio dai documenti.
— Isaia,

2
Sembra che questo sia stato rimosso da allora, ottenendoassignment count mismatch: 1 = 2 (use delete)
— ghayes il


0

Usa make (chan int)invece di nil. Il primo valore deve essere dello stesso tipo della tua mappa.

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
}

AGGIORNAMENTO: corretta la mia risposta.


sessions.go:6: cannot use 0 (type int) as type chan int

Oops, ho dimenticato che l'ho rimosso anch'io: P
— Isaia,

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

Quanto sopra viene compilato ed eseguito sulla mia versione di Go.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.