sync.Map.CompareAndDelete

Метод sync.Map.CompareAndDelete выполняет атомарное удаление элемента из конкурентной карты, но только при условии, что текущее значение ключа совпадает с переданным ожидаемым значением. В первый параметр мы передаем ключ, который нужно удалить. Во второй параметр мы передаем ожидаемое значение, которое должно быть у элемента для его удаления. Метод возвращает true, если удаление произошло успешно (значение существовало и совпало с ожидаемым), и false в противном случае.

Синтаксис

gom.CompareAndDelete(key, old)

Пример

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

gopackage main

import (
  "fmt"
  "sync"
)

func main() {
  var m sync.Map
  
  m.Store("age", 25)
  deleted := m.CompareAndDelete("age", 25)
  fmt.Println(deleted)
  
  val, ok := m.Load("age")
  fmt.Println(val, ok)
}

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

gotrue
<nil> false

Пример

Попробуем удалить элемент с несовпадающим значением:

gopackage main

import (
  "fmt"
  "sync"
)

func main() {
  var m sync.Map
  
  m.Store("age", 25)
  deleted := m.CompareAndDelete("age", 30)
  fmt.Println(deleted)
  
  val, ok := m.Load("age")
  fmt.Println(val, ok)
}

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

gofalse
25 true

Пример

Попробуем удалить несуществующий ключ:

gopackage main

import (
  "fmt"
  "sync"
)

func main() {
  var m sync.Map
  
  m.Store("name", "John")
  deleted := m.CompareAndDelete("age", 25)
  fmt.Println(deleted)
  
  val, ok := m.Load("name")
  fmt.Println(val, ok)
}

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

gofalse
John true

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

  • метод sync.Map.CompareAndSwap,
    который атомарно заменяет значение по ключу
  • метод sync.Map.LoadAndDelete,
    который удаляет элемент и возвращает его предыдущее значение
  • метод sync.Map.Delete,
    который удаляет элемент по ключу без проверки значения
  • метод sync.Map.Swap,
    который атомарно обменивает значение по ключу