РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
861 of 1593 menu

sync.Map.LoadAndDelete

Метод sync.Map.LoadAndDelete атомарно выполняет две операции: загружает значение, связанное с указанным ключом, и удаляет этот ключ из карты. Метод возвращает загруженное значение и булевый флаг, указывающий на присутствие ключа. В первый параметр передается ключ, значение для которого требуется загрузить и удалить.

Синтаксис

value, loaded := m.LoadAndDelete(key)

Метод принимает один параметр key — ключ для загрузки и удаления. Возвращает два значения: само значение и булев флаг loaded, который равен true, если ключ присутствовал в карте, и false — в противном случае.

Пример

Давайте создадим sync.Map, добавим в него несколько элементов и с помощью LoadAndDelete загрузим и удалим ключ:

package main import ( "fmt" "sync" ) func main() { var m sync.Map // Добавляем элементы в карту m.Store("one", 1) m.Store("two", 2) m.Store("three", 3) // Загружаем и удаляем ключ "two" val, loaded := m.LoadAndDelete("two") fmt.Printf("loaded: %v, value: %v\n", loaded, val) // Проверяем наличие ключа "two" после удаления _, exists := m.Load("two") fmt.Printf("key 'two' exists after delete: %v\n", exists) }

Результат выполнения кода:

"loaded: true, value: 2" "key 'two' exists after delete: false"

Как видно из примера, метод успешно загрузил значение для ключа "two" и удалил его из карты.

Пример

Рассмотрим случай, когда запрашиваемый ключ отсутствует в карте:

package main import ( "fmt" "sync" ) func main() { var m sync.Map // Попытка загрузить и удалить отсутствующий ключ val, loaded := m.LoadAndDelete("nonexistent") fmt.Printf("loaded: %v, value: %v\n", loaded, val) }

Результат выполнения кода:

"loaded: false, value: <nil>"

В этом случае метод возвращает false и нулевое значение для типа, хранящегося в карте.

Пример

Продемонстрируем использование LoadAndDelete в конкурентной среде с несколькими горутинами:

package main import ( "fmt" "sync" ) func main() { var m sync.Map var wg sync.WaitGroup // Заполняем карту for i := 0; i < 5; i++ { m.Store(i, i*10) } // Запускаем несколько горутин для конкурентного удаления for i := 0; i < 5; i++ { wg.Add(1) go func(key int) { defer wg.Done() val, loaded := m.LoadAndDelete(key) if loaded { fmt.Printf("Goroutine deleted key %d with value %d\n", key, val) } else { fmt.Printf("Goroutine key %d not found\n", key) } }(i) } wg.Wait() }

Результат выполнения кода (порядок строк может отличаться):

"Goroutine deleted key 0 with value 0" "Goroutine deleted key 1 with value 10" "Goroutine deleted key 2 with value 20" "Goroutine deleted key 3 with value 30" "Goroutine deleted key 4 with value 40"

Этот пример показывает, что метод безопасен для использования из нескольких горутин одновременно.

Смотрите также

  • метод sync.Map.Store,
    который добавляет или обновляет значение по ключу
  • метод sync.Map.Load,
    который загружает значение по ключу без удаления
  • метод sync.Map.LoadOrStore,
    который загружает существующее значение или сохраняет новое
  • метод sync.Map.Delete,
    который удаляет ключ из карты без возврата значения
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить