usunąć mapę [klucz] w go?

166

Mam mapę:

var sessions =  map[string] chan int{}

Jak mogę usunąć sessions[key]? Próbowałem:

sessions[key] = nil,false;

To nie zadziałało.


Aktualizacja (listopad 2011):

Specjalna składnia do usuwania wpisów mapy została usunięta w wersji Go 1 :

Go 1 usunie specjalne przypisanie mapy i wprowadzi nową wbudowaną funkcję delete:: delete(m, x)usunie wpis mapy pobrany przez wyrażenie m[x]. ...

jonaz
źródło

Odpowiedzi:

154

O dziwo,

package main

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

wydaje się działać. Wydaje się to jednak kiepskim wykorzystaniem zasobów!

Innym sposobem jest sprawdzenie istnienia i użycie samej wartości:

package main

func main () {
    var sessions = map[string] chan int{};
    sessions["moo"] = make (chan int);
    _, ok := sessions["moo"];
    if ok {
        delete(sessions, "moo");
    }
}
coolaj86
źródło
Wyszukiwanie wartości i ponowne użycie musi być tańsze: sessions["moo"] = sessions["moo"], false;(a może to źle?)
u0b34a0f6ae
To ulega awarii, chyba że klucz jest obecny. Dodałem kolejne rozwiązanie na podstawie Twojego pomysłu.
1
Czy jest to bezpieczne w użyciu podczas rozszerzania samej mapy?
Jorge Ramirez,
@JorgeRamirez Nie wierzę w to. jeśli chcesz to zrobić, znajdź sposób na iterację po wycinku kluczy zamiast samego obiektu mapy
Seaux,
6
Dlaczego drugie rozwiązanie to lepsze wykorzystanie zasobów? W drugim rozwiązaniu wykonujesz dwa wyszukiwania kluczy, podczas gdy w pierwszym rozwiązaniu wykonujesz wyszukiwanie jednego klucza.
thebiggestlebowski
86

Skopiowano z informacji o wersji Go 1

W starym języku, aby usunąć wpis z kluczem kz mapy reprezentowanej przez m, napisano instrukcję,

m[k] = value, false

Ta składnia była szczególnym przypadkiem, jedynym przypisaniem dwa do jednego. Wymagało to przekazania wartości (zwykle ignorowanej), która jest oceniana, ale odrzucana, plus wartość logiczna, która prawie zawsze była stałą fałszem. Spełniło to zadanie, ale było dziwne i sporne.

W Go 1 ta składnia zniknęła; Zamiast tego jest nowa wbudowanej funkcji delete. Telefon

delete(m, k)

usunie wpis mapy pobrany przez wyrażenie m[k]. Nie ma wartości zwracanej. Usunięcie nieistniejącego wpisu nie jest możliwe.

Aktualizacja: Uruchomienie go fixkonwertuje wyrażenia formularza m[k] = value, falsena delete(m, k)wtedy, gdy jest jasne, że ignorowaną wartość można bezpiecznie usunąć z programu i falseodwołuje się do wstępnie zdefiniowanej stałej boolowskiej. Narzędzie naprawcze oznaczy inne zastosowania składni do sprawdzenia przez programistę.

hannson
źródło
55

Od Effective Go :

Aby usunąć wpis mapy, użyj wbudowanej funkcji delete, której argumentami są mapa i klucz do usunięcia. Można to bezpiecznie zrobić, nawet jeśli klucza już nie ma na mapie.

delete(timeZone, "PDT")  // Now on Standard Time
György Andrasek
źródło
sessions.go:6: cannot use 0 (type int) as type chan int
3
@Kinopiko: Nie sądzę, by Jurily był przeznaczony dla OP do używania tego fragmentu kodu. Właśnie skopiował przykład z dokumentacji.
Izajasza
2
Wygląda na to, że zostało to usunięte od tego czasu, otrzymującassignment count mismatch: 1 = 2 (use delete)
ghayes
0

Użyj make (chan int)zamiast nil. Pierwsza wartość musi być tego samego typu, co twoja 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
}

UPDATE: Poprawiłem moją odpowiedź.

Izajasz
źródło
sessions.go:6: cannot use 0 (type int) as type chan int
Ups, zapomniałem, że to też usunąłem: P
Izajasz
package main func main () {var sessions = map[string] chan int{};sessions["moo"] = make (chan int);}
Powyższe kompiluje i działa w mojej wersji Go.