Подтвердить что ты не робот

Удалить карту [ключ] в go?

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

var sessions =  map[string] chan int{}

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

sessions[key] = nil,false;

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


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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

m[k] = value, false

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

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

delete(m, k)

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

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

Ответ 3

От Эффективный переход:

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

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

Ответ 4

delete(sessions, "anykey")

В эти дни ничего не выйдет.

Ответ 5

Используйте 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 value from sessions
    delete(sessions, "somekey")

    fmt.Printf ("%d\n", len(sessions)) // 0
}

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