Sobes.tech
Junior — Middle

Wyjaśnij cel i zasadę działania struktury sync.Once w Go.

sobes.tech AI

Odpowiedź od AI

sync.Once w Go jest używany do zapewnienia, że określona operacja (np. inicjalizacja) zostanie wykonana dokładnie raz, nawet jeśli kilka gorutyn wywoła ją jednocześnie. Jest to przydatne do leniwej inicjalizacji lub konfiguracji zasobów.

Zasada działania:

  • sync.Once zawiera wewnętrzny flaga, która śledzi, czy funkcja już została wykonana.
  • Metoda Do(f func()) przyjmuje funkcję f i gwarantuje, że zostanie ona wywołana tylko raz.
  • Jeśli kilka gorutyn wywoła Do jednocześnie, tylko jedna z nich wykona funkcję, pozostałe będą czekać na jej zakończenie.

Przykład:

var once sync.Once

func initialize() {
    fmt.Println("Inicjalizacja zakończona")
}

func main() {
    for i := 0; i < 5; i++ {
        go func() {
            once.Do(initialize)
        }()
    }
    time.Sleep(time.Second) // Czekanie na gorutyny
}

W tym przykładzie wiadomość "Inicjalizacja zakończona" zostanie wyświetlona dokładnie raz.