go / intermediate
Snippet
Garantierte einmalige Initialisierung mit sync.Once
Der Typ sync.Once garantiert, dass eine Funktion über alle Goroutinen hinweg genau einmal ausgeführt wird. Dies wird häufig für die threadsichere, verzögerte Initialisierung (Lazy Initialization) verwendet, z. B. zum Einrichten globaler Konfigurationen, Verbindungs-Pools oder Singletons, ohne dass explizite Locks oder manuelle doppelt überprüfte Sperren erforderlich sind.
snippet.go
go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
package mainimport ("fmt""sync")type Config struct {Value string}var (instance *Configonce sync.Once)func GetConfig() *Config {once.Do(func() {instance = &Config{Value: "Initialized"}})return instance}func main() {c1 := GetConfig()c2 := GetConfig()fmt.Println(c1 == c2) // true}
Erklärung
1
once sync.Once
Deklariert eine sync.Once-Variable zur Koordinierung des Ausführungsstatus.
2
once.Do(func() { ... })
Führt die übergebene Funktion genau einmal aus. Nachfolgende Aufrufe von Do blockieren, bis die erste Ausführung abgeschlossen ist, und kehren dann sofort zurück, ohne die Funktion erneut auszuführen.
3
return instance
Gibt den initialisierten globalen Zeiger zurück und stellt sicher, dass alle Aufrufer dieselbe Referenz erhalten.