Sobes.tech
Junior — Middle
103

Go тілінде sync.Once құрылымының мақсаты мен жұмыс істеу принципін түсіндіріңіз.

Сұралған компаниялар
OZONOZON

AI-дан жауап

sobes.tech 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) // Ждём завершения горутин
}

В этом примере сообщение "Инициализация выполнена" будет выведено ровно один раз.