sync.Once e sync.Map
Inizializzazione una tantum e map concorrenti
sync.Once e sync.Map è una lezione Go Academy gratuita su CoddyKit. Questa è la lezione 3 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Go Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Go Academy include 4 lezioni in totale.
sync.Once
sync.Once garantisce che una funzione venga eseguita esattamente una volta, indipendentemente dal numero di goroutine che la chiamano contemporaneamente. Un caso d'uso classico è l'inizializzazione lazy di un singleton.
Once.Do
Solo la prima chiamata a Do esegue la funzione; le chiamate successive non eseguono alcuna operazione, anche se provengono da goroutine diverse.
var once sync.Once
var db *Database
func getDB() *Database {
once.Do(func() { db = openDB() })
return db
}Once non viene reimpostato
Una volta attivato un sync.Once, non è possibile reimpostarlo. Se ha bisogno di un'esecuzione una tantum che possa essere reimpostata, gestisca manualmente lo stato con un valore atomico o un mutex.
Comportamento di Once in caso di panic
Se la funzione passata a Do genera un panic, Do viene considerato completato e le chiamate future non eseguono alcuna operazione. Il panic viene propagato al primo chiamante.
Panoramica di sync.Map
sync.Map è una mappa concorrente che non richiede lock esterni. È ottimizzata per due pattern: (1) scrittura una tantum e molte letture; (2) insiemi di chiavi disgiunti per goroutine.
Metodi di sync.Map
Metodi principali: Store, Load, LoadOrStore, Delete, Range. Non sono disponibili parametri di tipo generico: chiavi e valori sono di tipo interface{}.
var m sync.Map
m.Store("key", 42)
v, ok := m.Load("key")
if ok { fmt.Println(v.(int)) }LoadOrStore
LoadOrStore restituisce il valore esistente se la chiave è presente; altrimenti memorizza e restituisce il nuovo valore. Il booleano indica se il valore è stato caricato (true) o memorizzato (false).
actual, loaded := m.LoadOrStore("key", "default")
if loaded { fmt.Println("existing:", actual) }Range
Range itera su tutte le coppie chiave-valore chiamando la funzione per ciascuna di esse. Restituisca false per interrompere l'iterazione.
m.Range(func(k, v any) bool {
fmt.Println(k, v)
return true // continue
})Quando usare sync.Map
Nella maggior parte dei casi preferisca una normale map con un Mutex: è più semplice e spesso più veloce. Utilizzi sync.Map quando il profiling evidenzia contesa o quando il pattern di accesso corrisponde ai suoi casi d'uso ottimizzati.
LoadAndDelete
LoadAndDelete carica atomicamente il valore ed elimina la chiave, restituendo il valore precedente e indicando se la chiave era presente.
v, loaded := m.LoadAndDelete("key")
if loaded { fmt.Println("deleted:", v) }sync.Map non è generico
I valori memorizzati in sync.Map sono di tipo any. Racchiuda sync.Map in una struct tipizzata con metodi type-safe per evitare asserzioni di tipo sparse nel codebase.
Verifica rapida
Cosa garantisce sync.Once?
Riepilogo: sync.Once e sync.Map
Punti chiave:
- sync.Once: esegue una funzione esattamente una volta; è irreversibile
- sync.Map: mappa concorrente ottimizzata per pattern con molte letture o chiavi disgiunte
- Utilizzi wrapper tipizzati intorno a sync.Map per maggiore sicurezza
Impara Go con un tutor IA — gratis
Scrivi ed esegui vero codice nel tuo browser, ricevi aiuto istantaneo da un tutor IA disponibile 24/7, e riprendi da dove hai lasciato sul web o nell'app.
- Corsi
- 51
- Lezioni
- 203
Domande Frequenti
La lezione «sync.Once e sync.Map» è gratuita?
Sì — il testo completo di «sync.Once e sync.Map» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Go Academy, passa a CoddyKit PRO. Il corso Go Academy include 4 lezioni in totale.
Cosa imparerò in «sync.Once e sync.Map»?
Inizializzazione una tantum e map concorrenti Eserciti Go Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare Go Academy?
Non è richiesta alcuna esperienza precedente. Go Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 4.
Quanto tempo richiede la lezione «sync.Once e sync.Map»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione Go Academy?
Sì. Ogni lezione Go Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- sync.Mutex e sync.RWMutex
- sync.WaitGroup
- sync.Once e sync.Map
- Race detector e modelli sicuri