sync.Once und sync.Map
Einmalige Initialisierung und nebenläufige Maps
sync.Once und sync.Map ist eine kostenlose Go Academy-Lektion auf CoddyKit. Dies ist Lektion 3 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Go Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Go Academy-Kurs umfasst insgesamt 4 Lektionen.
sync.Once
sync.Once garantiert, dass eine Funktion genau einmal ausgeführt wird, unabhängig davon, wie viele Goroutines sie gleichzeitig aufrufen. Ein klassischer Anwendungsfall ist die verzögerte Initialisierung eines Singletons.
Once.Do
Nur der erste Aufruf von Do führt die Funktion aus. Nachfolgende Aufrufe sind No-ops, auch wenn sie aus verschiedenen Goroutines erfolgen.
var once sync.Once
var db *Database
func getDB() *Database {
once.Do(func() { db = openDB() })
return db
}Once wird nicht zurückgesetzt
Sobald ein sync.Once ausgelöst wurde, kann es nicht zurückgesetzt werden. Wenn Sie eine zurücksetzbare Einmalausführung benötigen, verwalten Sie den Zustand manuell mit einem Atomic oder einem Mutex.
Das Verhalten von Once bei Panics
Wenn die an Do übergebene Funktion eine Panic auslöst, gilt Do als abgeschlossen und zukünftige Aufrufe sind No-ops. Die Panic wird an den ersten Aufrufer weitergegeben.
Überblick über sync.Map
sync.Map ist eine nebenläufige Map, für die keine externe Sperre erforderlich ist. Sie ist für zwei Muster optimiert: (1) einmaliges Schreiben und vielfaches Lesen; (2) disjunkte Schlüsselmengen pro Goroutine.
Methoden von sync.Map
Wichtige Methoden: Store, Load, LoadOrStore, Delete und Range. Es gibt keine generischen Typparameter – Schlüssel und Werte haben den Typ interface{}.
var m sync.Map
m.Store("key", 42)
v, ok := m.Load("key")
if ok { fmt.Println(v.(int)) }LoadOrStore
LoadOrStore gibt den vorhandenen Wert zurück, wenn der Schlüssel existiert. Andernfalls speichert und gibt es den neuen Wert zurück. Der boolesche Wert gibt an, ob der Wert geladen (true) oder gespeichert (false) wurde.
actual, loaded := m.LoadOrStore("key", "default")
if loaded { fmt.Println("existing:", actual) }Range
Range durchläuft alle Schlüssel-Wert-Paare und ruft für jedes Paar die Funktion auf. Geben Sie false zurück, um die Iteration zu beenden.
m.Range(func(k, v any) bool {
fmt.Println(k, v)
return true // continue
})Wann Sie sync.Map verwenden sollten
Verwenden Sie in den meisten Fällen bevorzugt eine reguläre Map mit einem Mutex – sie ist einfacher und oft schneller. Verwenden Sie sync.Map, wenn das Profiling eine hohe Konkurrenz zeigt oder das Zugriffsmuster den Optimierungszielen von sync.Map entspricht.
LoadAndDelete
LoadAndDelete lädt den Wert atomar und löscht den Schlüssel. Dabei werden der vorherige Wert und die Information zurückgegeben, ob der Schlüssel vorhanden war.
v, loaded := m.LoadAndDelete("key")
if loaded { fmt.Println("deleted:", v) }sync.Map ist nicht generisch
In sync.Map gespeicherte Werte haben den Typ any. Kapseln Sie sync.Map in einer typisierten Struktur mit typsicheren Methoden, um verstreute Typassertionen in Ihrer Codebasis zu vermeiden.
Schnelltest
Was garantiert sync.Once?
Zusammenfassung: sync.Once und sync.Map
Wichtige Punkte:
- sync.Once: Eine Funktion genau einmal ausführen; nicht rückgängig machbar
- sync.Map: Nebenläufige Map, optimiert für leseintensive Zugriffsmuster oder disjunkte Schlüsselbereiche
- Verwenden Sie aus Sicherheitsgründen typisierte Wrapper um sync.Map
Häufig gestellte Fragen
Ist die Lektion „sync.Once und sync.Map“ kostenlos?
Ja — der vollständige Text von „sync.Once und sync.Map“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Go Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Go Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „sync.Once und sync.Map“?
Einmalige Initialisierung und nebenläufige Maps Du übst Go Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um Go Academy zu starten?
Keine Vorkenntnisse erforderlich. Go Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 3 von 4.
Wie lange dauert die Lektion „sync.Once und sync.Map“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser Go Academy-Lektion Code schreiben und ausführen?
Ja. Jede Go Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- sync.Mutex und sync.RWMutex
- sync.WaitGroup
- sync.Once und sync.Map
- Race Detector und sichere Patterns