Удалить карту [ключ] в go?
У меня есть карта:
var sessions = map[string] chan int{}
Как удалить sessions[key]
? Я пробовал:
sessions[key] = nil,false;
Это не сработало.
Обновить (ноябрь 2011 г.):
Специальный синтаксис для удаления записей карты удаляется в Перейти к версии 1:
Go 1 удалит специальное назначение карты и представит новую встроенную функцию, delete
: delete(m, x)
удалит запись карты, полученную выражением m[x]
....
Ответы
Ответ 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
На старом языке, чтобы удалить запись с ключом 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
}
ОБНОВЛЕНИЕ: Исправлен мой ответ.