sync.Once et sync.Map
Initialisation unique et maps concurrentes
sync.Once et sync.Map est une leçon Go Academy gratuite sur CoddyKit. Ceci est la leçon 3 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Go Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Go Academy comprend 4 leçons au total.
sync.Once
sync.Once garantit qu’une fonction s’exécute exactement une fois, quel que soit le nombre de goroutines qui l’appellent simultanément. Cas d’utilisation classique : initialisation différée d’un singleton.
Once.Do
Seul le premier appel à Do exécute la fonction ; les appels suivants sont sans effet, même s’ils proviennent de goroutines différentes.
var once sync.Once
var db *Database
func getDB() *Database {
once.Do(func() { db = openDB() })
return db
}Once ne se réinitialise pas
Une fois qu’un sync.Once a été déclenché, il ne peut pas être réinitialisé. Si vous avez besoin d’une exécution unique réinitialisable, gérez manuellement l’état avec une opération atomique ou un mutex.
Comportement de Once en cas de panique
Si la fonction transmise à Do provoque une panique, Do est considéré comme terminé et les appels suivants sont sans effet. La panique est propagée au premier appelant.
Présentation de sync.Map
sync.Map est une table associative concurrente qui ne nécessite aucun verrouillage externe. Elle est optimisée pour deux schémas : (1) une écriture suivie de nombreuses lectures ; (2) des ensembles de clés disjoints pour chaque goroutine.
Méthodes de sync.Map
Méthodes clés : Store, Load, LoadOrStore, Delete, Range. Il n’y a pas de paramètres de type génériques : les clés et les valeurs sont de type interface{}.
var m sync.Map
m.Store("key", 42)
v, ok := m.Load("key")
if ok { fmt.Println(v.(int)) }LoadOrStore
LoadOrStore renvoie la valeur existante si la clé existe ; sinon, il stocke et renvoie la nouvelle valeur. Le booléen indique si la valeur a été chargée (true) ou stockée (false).
actual, loaded := m.LoadOrStore("key", "default")
if loaded { fmt.Println("existing:", actual) }Range
Range parcourt toutes les paires clé-valeur en appelant la fonction pour chacune. Renvoyez false pour arrêter l’itération.
m.Range(func(k, v any) bool {
fmt.Println(k, v)
return true // continue
})Quand utiliser sync.Map
Dans la plupart des cas, préférez une table associative classique avec un Mutex : elle est plus simple et souvent plus rapide. Utilisez sync.Map lorsque le profilage révèle une contention ou lorsque le schéma d’accès correspond à ses cibles d’optimisation.
LoadAndDelete
LoadAndDelete charge atomiquement la valeur et supprime la clé, en renvoyant la valeur précédente ainsi qu’une indication de sa présence.
v, loaded := m.LoadAndDelete("key")
if loaded { fmt.Println("deleted:", v) }sync.Map n’est pas générique
Les valeurs stockées dans sync.Map sont de type any. Encapsulez sync.Map dans une structure typée dotée de méthodes sûres du point de vue des types afin d’éviter de disperser les assertions de type dans votre base de code.
Vérification rapide
Que garantit sync.Once ?
Récapitulatif : sync.Once et sync.Map
Points essentiels :
- sync.Once : exécute une fonction exactement une fois ; fonctionnement irréversible
- sync.Map : table associative concurrente optimisée pour les schémas comportant beaucoup de lectures ou des clés disjointes
- Utilisez des enveloppes typées autour de sync.Map pour plus de sûreté
Questions Fréquemment Posées
La leçon « sync.Once et sync.Map » est-elle gratuite ?
Oui — le texte complet de « sync.Once et sync.Map » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Go Academy, passe à CoddyKit PRO. Le cours Go Academy comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « sync.Once et sync.Map » ?
Initialisation unique et maps concurrentes Tu pratiques Go Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer Go Academy ?
Aucune expérience préalable n'est requise. Go Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 3 sur 4.
Combien de temps prend la leçon « sync.Once et sync.Map » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon Go Academy ?
Oui. Chaque leçon Go Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- sync.Mutex et sync.RWMutex
- sync.WaitGroup
- sync.Once et sync.Map
- Détecteur de courses et modèles sûrs