Sobes.tech
Junior — Middle

Обяснете предназначението и принципа на работа на структурата sync.Once в Go.

sobes.tech AI

Отговор от AI

sync.Once в Go се използва за гарантиране, че определена операция (например инициализация) ще бъде изпълнена точно веднъж, дори ако няколко горутини я извикват едновременно. Това е полезно за лениво инициализиране или настройка на ресурси.

Принцип на работа:

  • sync.Once съдържа вътрешен флаг, който следи дали функцията вече е изпълнена.
  • Методът Do(f func()) приема функция f и гарантира, че тя ще бъде извикана само веднъж.
  • Ако няколко горутини извикат Do едновременно, само една от тях ще изпълни функцията, останалите ще изчакат да приключи.

Пример:

var once sync.Once

func initialize() {
    fmt.Println("Инициализацията е завършена")
}

func main() {
    for i := 0; i < 5; i++ {
        go func() {
            once.Do(initialize)
        }()
    }
    time.Sleep(time.Second) // Изчакване за завършване на горутините
}

В този пример съобщението "Инициализацията е завършена" ще бъде изведено точно веднъж.