Sobes.tech
Junior — Middle

Paaiškinkite sync.Once struktūros paskirtį ir veikimo principą Go kalboje.

sobes.tech AI

Atsakymas iš AI

sync.Once Go kalboje naudojamas užtikrinti, kad tam tikra operacija (pvz., inicializacija) būtų atlikta tik kartą, net jei kelios gorutinos ją kviečia vienu metu. Tai naudinga vėlyvai inicializacijai arba išteklių konfigūravimui.

Veikimo principas:

  • sync.Once turi vidinį žymeklį, kuris stebi, ar funkcija jau buvo vykdyta.
  • Metodas Do(f func()) priima funkciją f ir užtikrina, kad ji bus iškviesta tik kartą.
  • Jei kelios gorutinos kviečia Do vienu metu, tik viena iš jų vykdys funkciją, kitos lauks jos pabaigos.

Pavyzdys:

var once sync.Once

func initialize() {
    fmt.Println("Inicijalizacija baigta")
}

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

Šiame pavyzdyje pranešimas "Inicijalizacija baigta" bus išspausdintas tik vieną kartą.