sync.Once y sync.Map
Inicialización única y maps concurrentes
sync.Once y sync.Map es una lección gratuita de Go Academy en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Go Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Go Academy incluye 4 lecciones en total.
sync.Once
sync.Once garantiza que una función se ejecute exactamente una vez, sin importar cuántas goroutines la llamen simultáneamente. Un caso de uso clásico es la inicialización diferida de un singleton.
Once.Do
Solo la primera llamada a Do ejecuta la función; las llamadas posteriores no hacen nada, aunque se realicen desde goroutines diferentes.
var once sync.Once
var db *Database
func getDB() *Database {
once.Do(func() { db = openDB() })
return db
}Once no se restablece
Una vez que se ha ejecutado sync.Once, no se puede restablecer. Si necesita una ejecución única que se pueda restablecer, gestione el estado manualmente con un atómico o un mutex.
Comportamiento de Once ante un pánico
Si la función pasada a Do provoca un pánico, Do se considera completado y las llamadas futuras no hacen nada. El pánico se propaga al primer llamador.
Descripción general de sync.Map
sync.Map es un mapa concurrente que no requiere bloqueos externos. Está optimizado para dos patrones: (1) escribir una vez y leer muchas veces; (2) conjuntos de claves sin intersección para cada goroutine.
Métodos de sync.Map
Métodos principales: Store, Load, LoadOrStore, Delete y Range. No tiene parámetros de tipo genérico; las claves y los valores son interface{}.
var m sync.Map
m.Store("key", 42)
v, ok := m.Load("key")
if ok { fmt.Println(v.(int)) }LoadOrStore
LoadOrStore devuelve el valor existente si la clave existe; de lo contrario, almacena y devuelve el nuevo valor. El booleano indica si el valor se cargó (true) o se almacenó (false).
actual, loaded := m.LoadOrStore("key", "default")
if loaded { fmt.Println("existing:", actual) }Range
Range recorre todos los pares clave-valor y llama a la función para cada uno. Devuelva false para detener la iteración.
m.Range(func(k, v any) bool {
fmt.Println(k, v)
return true // continue
})Cuándo utilizar sync.Map
En la mayoría de los casos, prefiera un mapa normal con un Mutex: es más sencillo y a menudo más rápido. Utilice sync.Map cuando el perfilado muestre contención o cuando el patrón de acceso coincida con sus objetivos de optimización.
LoadAndDelete
LoadAndDelete carga atómicamente el valor y elimina la clave, y devuelve el valor anterior y si la clave estaba presente.
v, loaded := m.LoadAndDelete("key")
if loaded { fmt.Println("deleted:", v) }sync.Map no es genérico
Los valores almacenados en sync.Map son any. Encapsule sync.Map en una estructura con métodos tipados para evitar aserciones de tipo dispersas por su base de código.
Comprobación rápida
¿Qué garantiza sync.Once?
Repaso: sync.Once y sync.Map
Puntos clave:
- sync.Once: ejecuta una función exactamente una vez; es irreversible
- sync.Map: mapa concurrente optimizado para patrones con muchas lecturas o con claves sin intersección
- Utilice envoltorios tipados alrededor de sync.Map para mayor seguridad
Preguntas frecuentes
¿La lección «sync.Once y sync.Map» es gratis?
Sí — el texto completo de «sync.Once y sync.Map» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Go Academy, actualiza a CoddyKit PRO. El curso de Go Academy incluye 4 lecciones en total.
¿Qué aprenderé en «sync.Once y sync.Map»?
Inicialización única y maps concurrentes Practicas Go Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar Go Academy?
No se requiere experiencia previa. Go Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.
¿Cuánto tiempo toma la lección «sync.Once y sync.Map»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de Go Academy?
Sí. Cada lección de Go Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- sync.Mutex y sync.RWMutex
- sync.WaitGroup
- sync.Once y sync.Map
- Detector de condiciones de carrera y patrones seguros