Middle
¿Qué sabes sobre el paquete sync.Map?
sobes.tech AI
Respuesta de la IA
El paquete sync.Map proporciona una tabla hash segura para acceso concurrente. Está optimizado para casos en los que las claves se leen principalmente y se escriben con menos frecuencia.
Características principales:
- Seguridad en paralelo: Garantiza acceso seguro desde múltiples goroutines sin bloqueos explícitos.
- Optimizado para lectura: La primera lectura de cada clave se almacena en caché como solo lectura. Las lecturas posteriores desde esta caché no requieren bloqueo.
- Eliminación dinámica: Los elementos eliminados se marcan primero como eliminados, y la eliminación real ocurre bajo ciertas condiciones para minimizar bloqueos durante la escritura.
- Ausencia del método
Len(): La compatibilidad conLen()haría que la implementación segura para paralelo sea compleja y costosa. - No apto para datos en constante cambio: Con escrituras y eliminaciones frecuentes, puede ser menos eficiente que usar un mutex con un
mapnormal.
Métodos principales:
Load(key any) (value any, ok bool): Carga el valor asociado con la clave. Si la clave no existe, devuelvefalse.Store(key, value any): Guarda un valor para la clave. Puede usarse para agregar o actualizar.LoadOrStore(key any, value any) (actual any, loaded bool): Carga el valor asociado con la clave si ya existe. De lo contrario, guarda el valor especificado. Devuelve el valor real y un indicador de si el valor fue cargado (true) o almacenado (false).Delete(key any): Elimina el valor para la clave.Range(f func(key, value any) bool): Itera sobre los elementos en el mapa en orden arbitrario. La funciónfse llama para cada par clave-valor. Sifdevuelvefalse, la iteración se detiene.
Ejemplo de uso:
import "sync"
var m sync.Map
func process(key string, value int) {
m.Store(key, value)
v, ok := m.Load(key)
if ok {
// Usar v
}
m.Range(func(key, value any) bool {
// Procesar elementos
return true // Continuar la iteración
})
}
En general, sync.Map es una buena opción cuando las lecturas paralelas superan significativamente a las escrituras y eliminaciones. De lo contrario, usar un map junto con sync.Mutex o sync.RWMutex puede ser más apropiado.