CodeBlanks Logo Icon CodeBlanks

sync.Once

Önce ile bir kodun yalnızca bir kez çalışmasını öğrenirsin.

sync.Once

sync.Once, bir fonksiyonun tüm program yaşamı boyunca yalnızca bir kez çalışmasını sağlar. once.Do(func) çağrısı ilk goroutine'de çalışır; sonraki çağrılar hiçbir şey yapmaz.

Önce, lazy initialization (tembel başlatma) için idealdir: bir değişkeni ilk kullanımda hazırlarsın. var once sync.Once; once.Do(func(){ cfg = load() }) kalıbı sık görülür.

Önce ve başlatma

Önce, global yapılandırma (config) yüklemek için kullanışlıdır. once.Do(func(){ cfg = loadConfig() }) ile config yalnızca ilk çağrıda yüklenir; sonraki çağrılar mevcut cfg'yi döndürür.

Önce thread-safe olduğundan ek mutex gerekmez. İçi boş olsa bile Do her zaman çağrılabilir; ilk çağrıdan sonra no-op olur.

Uygulama Önce ile yazdır

main içine bir sync.Once tanımı ve fmt.Println ile önce tamam yazdır.

Başlangıç kodu

main.go
package main

import "fmt"

func main() {
    // buraya yaz
}

Örnek çözüm

main.go
package main

import (
    "fmt"
    "sync"
)

func main() {
    var once sync.Once
    once.Do(func() { fmt.Println("once tamam") })
}

Beklenen çıktı

once tamam

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 sync.Once ne garantiler?

  • Hızlı çalışma
  • Tam bir kez çalışma Doğru cevap
  • Sonsuz döngü
  • Sıralı çalışma

Açıklama: tam bir kez çalışma. Hız Önce ile ilgili değil, kez sayısıdır.

2 Önce kullanımı

Soru
var once sync.Once
var cfg *Config
func getCfg() *Config {
    once.____(func() {
        cfg = loadConfig()
    })
    return cfg
}
Cevap
var once sync.Once
var cfg *Config
func getCfg() *Config {
    once.Do(func() {
        cfg = loadConfig()
    })
    return cfg
}

Açıklama: Run ve Call Önce'da yoktur.

3 Önce kavramlarını eşleştir

Kavram Anlamı
Do Bir kez çalıştır
sync.Once Tip
lazy init Tembel başlatma
thread-safe Güvenli

Orta seviye bölümündeki tüm dersler