Метод sync.Map.Delete
Метод sync.Map.Delete удаляет элемент с указанным ключом из конкурентной карты.
В качестве единственного параметра он принимает ключ, значение которого нужно удалить.
Если элемент с таким ключом отсутствует в карте, метод ничего не делает и не вызывает ошибку.
Этот метод является потокобезопасным и может вызываться одновременно из нескольких горутин.
Синтаксис
m.Delete(key)
Пример
Давайте создадим конкурентную карту, добавим в нее несколько элементов
и удалим элемент с ключом "b":
package 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)
}
}
Результат выполнения кода:
"b: not found"
"a: 1"
"c: 3"
Пример
Метод Delete безопасно вызывать даже для ключа, которого нет в карте:
package 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")
}
}
Результат выполнения кода:
"key: not found"
Пример
Метод Delete безопасно использовать при конкурентном доступе из нескольких горутин:
package 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)
}
Результат выполнения кода:
"Remaining elements: 0"
Смотрите также
-
метод
sync.Map.LoadAndDelete,
который загружает значение и удаляет элемент -
метод
sync.Map.Store,
который добавляет или обновляет элемент в конкурентной карте -
метод
sync.Map.Load,
который загружает значение по ключу -
метод
sync.Map.Range,
который перебирает все элементы карты