Treci la conținutul principal

Ce este

Șablonul Singleton se asigură că un tip are exact o singură instanță în tot programul și oferă tuturor același punct de acces la ea. Singleton-uri tipice: o configurație, un pool de conexiuni, un logger.

Unealta din Go pentru asta este sync.Once: codul de inițializare din once.Do() rulează exact o singură dată, chiar și atunci când multe goroutine îl cer în același timp.


Exemplu: o singură configurație pentru toți

Configurația este încărcată la primul apel GetConfig() și niciodată din nou. Fiecare apelant primește același pointer.

Încărcare o singură dată cu sync.Once

Linia „se încarcă configurația” este afișată o singură dată, deși GetConfig() este apelată de două ori — iar a == b dovedește că ambii apelanți dețin aceeași instanță.

Prompt
Scrie un program Go cu un singleton Config: o funcție GetConfig care folosește sync.Once, astfel încât configurația să fie încărcată exact o singură dată, afișând o linie în timpul încărcării. Apelează GetConfig de două ori, afișează numele aplicației și demonstrează că ambele apeluri returnează aceeași instanță, comparând pointerii.
Ieșire: program Go și rezultatul capturat

Când să îl folosești

Folosește-l atunci când chiar trebuie să existe un singur exemplar din ceva: o singură configurație încărcată, un singur pool de conexiuni, un singur cache — iar crearea lui este costisitoare sau duplicatele ar intra în conflict.

Renunță la el atunci când poți pur și simplu să creezi valoarea în main() și să o transmiți celor care au nevoie de ea. Transmiterea deschisă a dependențelor este mai clară decât accesul global — singleton-ul este ultima soluție, nu prima.


Avantaje și dezavantaje

Avantaje: instanță unică garantată; creare leneșă la prima utilizare; siguranță cu multe goroutine prin sync.Once.

Dezavantaje: este o variabilă globală deghizată — dependențele ascunse fac codul mai greu de urmărit; testele nu îl pot înlocui ușor cu o variantă falsă; folosirea în exces duce la programe încurcate.