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

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

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


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

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


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.
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.