видалити карту [ключ] у дорозі?


166

У мене є карта:

var sessions =  map[string] chan int{}

Як видалити sessions[key]? Я намагався:

sessions[key] = nil,false;

Це не спрацювало.


Оновлення (листопад 2011 р.):

У Go версії 1 видалено спеціальний синтаксис для видалення записів на карті :

Перехід 1 видалить спеціальне призначення карт та введе нову вбудовану функцію delete:: delete(m, x)видалить запис карти, отриманий виразом m[x]. ...

Відповіді:


154

Досить дивно,

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

Шукати значення та повторно використовувати його треба дешевше: sessions["moo"] = sessions["moo"], false;(чи це неправильно?)
u0b34a0f6ae

Це збої, якщо ключ не присутній. Я додав ще одне рішення на основі вашої ідеї.

1
Чи безпечно це використовувати під час ранжирування самої карти?
Хорхе Рамірес

@JorgeRamirez я не вірю в це. якщо ви хочете зробити це, знайдіть спосіб перебрати фрагмент клавіш замість самого об’єкта карти
Seaux,

6
Чому другим рішенням є краще використання ресурсів? У другому рішенні ви робите два ключових пошуку, тоді як у першому рішенні - один пошук ключів.
thebiggestlebowski

86

Скопійовано з нотаток до випуску Go 1

Старою мовою для видалення запису з ключем kз карти, представленої символом m, один написав заяву,

m[k] = value, false

Цей синтаксис був своєрідним особливим випадком, єдиним завданням «два в один». Це вимагало передачі значення (зазвичай ігнорується), яке оцінюється, але відкидається, плюс булеве значення, яке майже завжди було постійним хибним. Це зробило роботу, але було дивним і суперечливим.

У Go 1 цей синтаксис пішов; натомість є нова вбудована функція, delete. Виклик

delete(m, k)

видалить запис карти, отриманий виразом m[k]. Поверненого значення немає. Видалення неіснуючого запису - необов’язкове.

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


55

З ефективного переходу :

Щоб видалити запис на карті, використовуйте вбудовану функцію видалення, аргументами якої є карта та ключ, який потрібно видалити. Це безпечно робити, навіть якщо ключ вже відсутній на карті.

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

sessions.go:6: cannot use 0 (type int) as type chan int

3
@Kinopiko: Я не думаю, що Юрілий мав на увазі, щоб ОП використовувала цей фрагмент коду. Він просто скопіював приклад із документів.
Ісая

2
Схоже, це було видалено з того часу, отримуючиassignment count mismatch: 1 = 2 (use delete)
ghayes


0

Використовуйте 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
}

ОНОВЛЕННЯ: Виправлено мою відповідь.


sessions.go:6: cannot use 0 (type int) as type chan int

На жаль, я забув, що я і це зняв: P
Ісая

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

Вищезгадане складається і працює у моїй версії Go.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.