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.