Sobes.tech
Middle

Какво знаеш за пакета sync.Map?

sobes.tech AI

Отговор от AI

Пакетът sync.Map предоставя безопасна за паралелна употреба хеш таблица. Той е оптимизиран за случаи, когато ключовете се четат основно и по-рядко се записват.

Основни характеристики:

  • Паралелна безопасност: Гарантира безопасен достъп от няколко горутини без явни блокировки.
  • Оптимизиран за четене: При първото четене на всеки ключ, се кешира копие само за четене. Следващите четения от този кеш не изискват блокиране.
  • Динамично изтриване: Изтритите елементи първо се маркират като изтрити, а реалното изтриване се случва при определени условия, за да се минимизират блокировките при запис.
  • Липса на метод Len() : Поддръжката на Len() би направила паралелно безопасната реализация сложна и скъпа.
  • Не е подходящ за постоянно променящи се данни: При чести записи и изтривания, може да бъде по-малко ефективен от използването на мютекс с обикновена map.

Основни методи:

  • Load(key any) (value any, ok bool): Зарежда стойността, свързана с ключа. Ако ключът липсва, връща false.
  • Store(key, value any): Запазва стойност за ключа. Може да се използва за добавяне или актуализиране.
  • LoadOrStore(key any, value any) (actual any, loaded bool): Зарежда стойността, свързана с ключа, ако вече съществува. В противен случай, запазва посочената стойност. Връща фактическата стойност и флаг, който показва дали стойността е била заредена (true) или запазена (false).
  • Delete(key any): Изтрива стойността за ключа.
  • Range(f func(key, value any) bool): Итерация върху елементите в произволен ред. Функцията f се извиква за всяка двойка ключ-стойност. Ако f връща false, итерацията спира.

Пример за използване:

import "sync"

var m sync.Map

func process(key string, value int) {
	m.Store(key, value)

	v, ok := m.Load(key)
	if ok {
		// Използвайте v
	}

	m.Range(func(key, value any) bool {
		// Обработка на елементите
		return true // Продължаване на итерацията
	})
}

Общо взето, sync.Map е добър избор, когато паралелните четения значително превъзхождат записите и изтриванията. В противен случай, използването на map с sync.Mutex или sync.RWMutex може да бъде по-подходящо.