Метод sync.Map.Delete

Метод sync.Map.Delete удаляет элемент с указанным ключом из конкурентной карты. В качестве единственного параметра он принимает ключ, значение которого нужно удалить. Если элемент с таким ключом отсутствует в карте, метод ничего не делает и не вызывает ошибку. Этот метод является потокобезопасным и может вызываться одновременно из нескольких горутин.

Синтаксис

gom.Delete(key)

Пример

Давайте создадим конкурентную карту, добавим в нее несколько элементов и удалим элемент с ключом "b":

gopackage main

import (
  "fmt"
  "sync"
)

func main() {
  var m sync.Map

  // Добавляем элементы
  m.Store("a", 1)
  m.Store("b", 2)
  m.Store("c", 3)

  // Удаляем элемент с ключом "b"
  m.Delete("b")

  // Проверяем, что элемент удален
  if val, ok := m.Load("b"); ok {
    fmt.Println("b:", val)
  } else {
    fmt.Println("b: not found")
  }

  // Проверяем остальные элементы
  if val, ok := m.Load("a"); ok {
    fmt.Println("a:", val)
  }
  if val, ok := m.Load("c"); ok {
    fmt.Println("c:", val)
  }
}

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

go"b: not found"
"a: 1"
"c: 3"

Пример

Метод Delete безопасно вызывать даже для ключа, которого нет в карте:

gopackage main

import (
  "fmt"
  "sync"
)

func main() {
  var m sync.Map

  // Добавляем элемент
  m.Store("key", 100)

  // Удаляем существующий ключ
  m.Delete("key")

  // Удаляем несуществующий ключ
  m.Delete("nonexistent")

  // Проверяем результат
  if val, ok := m.Load("key"); ok {
    fmt.Println("key:", val)
  } else {
    fmt.Println("key: not found")
  }
}

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

go"key: not found"

Пример

Метод Delete безопасно использовать при конкурентном доступе из нескольких горутин:

gopackage main

import (
  "fmt"
  "sync"
  "time"
)

func main() {
  var m sync.Map

  // Заполняем карту
  for i := 0; i < 100; i++ {
    m.Store(i, i*10)
  }

  // Запускаем несколько горутин для удаления элементов
  var wg sync.WaitGroup
  for i := 0; i < 10; i++ {
    wg.Add(1)
    go func(start int) {
      defer wg.Done()
      for j := start; j < start+10; j++ {
        m.Delete(j)
        time.Sleep(time.Microsecond)
      }
    }(i * 10)
  }

  wg.Wait()

  // Проверяем количество оставшихся элементов
  count := 0
  m.Range(func(key, value any) bool {
    count++
    return true
  })
  fmt.Println("Remaining elements:", count)
}

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

go"Remaining elements: 0"

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

  • метод sync.Map.LoadAndDelete,
    который загружает значение и удаляет элемент
  • метод sync.Map.Store,
    который добавляет или обновляет элемент в конкурентной карте
  • метод sync.Map.Load,
    который загружает значение по ключу
  • метод sync.Map.Range,
    который перебирает все элементы карты