0 Tage Serie
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 main
import (
"fmt"
"sync"
)
type Config struct {
Value string
}
var (
instance *Config
once 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.