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 може да бъде по-подходящо.