sync.Once
- Go kursu
- Orta seviye
- Ders 22/80
- 4 dk
Ö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
package main
import "fmt"
func main() {
// buraya yaz
}Örnek çözüm
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ı
var once sync.Once
var cfg *Config
func getCfg() *Config {
once.____(func() {
cfg = loadConfig()
})
return cfg
}
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 |