удалить карту [ключ] в ходу? - PullRequest
100 голосов
/ 15 ноября 2009

У меня есть карта:

var sessions =  map[string] chan int{}

Как мне удалить sessions[key]? Я попробовал:

sessions[key] = nil,false;

Это не сработало.


Обновление (ноябрь 2011 г.):

Специальный синтаксис для удаления записей карты удален в Перейти к версии 1 :

Go 1 удалит специальное назначение карты и введет новую встроенную функцию, delete: delete(m, x) удалит запись карты, извлеченную выражением m[x]. ...

Ответы [ 5 ]

90 голосов
/ 15 ноября 2009

Как ни странно,

package main

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

похоже на работу. Это кажется плохим использованием ресурсов, хотя!

Другой способ - проверить существование и использовать само значение:

package main

func main () {
    var sessions = map[string] chan int{};
    sessions["moo"] = make (chan int);
    _, ok := sessions["moo"];
    if ok {
        delete(sessions, "moo");
    }
}
66 голосов
/ 25 апреля 2012

Скопировано с Go 1 заметки о выпуске

На старом языке, чтобы удалить запись с ключом k из карты k, один написал заявление,

m[k] = value, false

Этот синтаксис был своеобразным особым случаем, единственным присваиванием два к одному. Требуется передать значение (обычно игнорируемое), которое оценивается, но отбрасывается, плюс логическое значение, которое почти всегда было константой false. Это сделало работу, но было странно и предметом спора.

В Go 1 этот синтаксис исчез; вместо этого есть новая встроенная функция, delete. Звонок

delete(m, k)

удалит запись карты, найденную выражением m[k]. Нет возвращаемого значения. Удаление несуществующей записи не разрешено.

Обновление: Выполнение go fix преобразует выражения вида m[k] = value, false в delete(m, k), когда становится ясно, что игнорируемое значение можно безопасно удалить из программы, а false относится к предопределенная логическая константа. Инструмент исправления помечает другое использование синтаксиса для проверки программистом.

31 голосов
/ 15 ноября 2009

С Эффективное движение :

Чтобы удалить запись карты, используйте встроенную функцию удаления, аргументами которой являются карта и ключ, который нужно удалить. Это безопасно сделать, даже если ключ уже отсутствует на карте.

delete(timeZone, "PDT");  // Now on Standard Time
17 голосов
/ 05 июля 2011
delete(sessions, "anykey")

В наши дни ничего не сломается.

0 голосов
/ 15 ноября 2009

Используйте make (chan int) вместо nil. Первое значение должно быть того же типа, что и ваша карта.

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
}

ОБНОВЛЕНИЕ: Исправил мой ответ.

...