sync.Once i sync.Map
Jednorazowa inicjalizacja i współbieżne mapy
sync.Once i sync.Map to bezpłatna lekcja Go Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Go Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Go Academy zawiera 4 lekcji w sumie.
sync.Once
sync.Once gwarantuje, że funkcja zostanie wykonana dokładnie raz, niezależnie od tego, ile gorutyn wywoła ją równocześnie. Klasyczny przypadek użycia to leniwa inicjalizacja singletonu.
Once.Do
Tylko pierwsze wywołanie Do wykonuje funkcję; kolejne wywołania nic nie robią, nawet jeśli pochodzą z różnych gorutyn.
var once sync.Once
var db *Database
func getDB() *Database {
once.Do(func() { db = openDB() })
return db
}Once nie można zresetować
Po uruchomieniu sync.Once nie można go zresetować. Jeśli potrzebujesz resetowalnego wykonania jednorazowego, zarządzaj stanem ręcznie za pomocą operacji atomowej lub mutexu.
Zachowanie Once w przypadku panic
Jeśli funkcja przekazana do Do wywoła panic, wywołanie Do uznaje się za zakończone, a przyszłe wywołania nic nie robią. Panic jest propagowany do pierwszego wywołującego.
Przegląd sync.Map
sync.Map to współbieżna mapa, która nie wymaga zewnętrznego blokowania. Jest zoptymalizowana pod kątem dwóch wzorców: (1) zapis raz, wiele odczytów; (2) rozłączne zbiory kluczy dla poszczególnych gorutyn.
Metody sync.Map
Najważniejsze metody to: Store, Load, LoadOrStore, Delete i Range. Brak parametrów typów generycznych — klucze i wartości mają typ interface{}.
var m sync.Map
m.Store("key", 42)
v, ok := m.Load("key")
if ok { fmt.Println(v.(int)) }LoadOrStore
LoadOrStore zwraca istniejącą wartość, jeśli klucz istnieje; w przeciwnym razie zapisuje i zwraca nową wartość. Wartość logiczna wskazuje, czy wartość została wczytana (true), czy zapisana (false).
actual, loaded := m.LoadOrStore("key", "default")
if loaded { fmt.Println("existing:", actual) }Range
Range iteruje po wszystkich parach klucz-wartość, wywołując funkcję dla każdej z nich. Zwróć false, aby przerwać iterację.
m.Range(func(k, v any) bool {
fmt.Println(k, v)
return true // continue
})Kiedy używać sync.Map
W większości przypadków preferuj zwykłą mapę z Mutex — jest prostsza i często szybsza. Używaj sync.Map, gdy profilowanie wykazuje rywalizację albo wzorzec dostępu odpowiada celom jego optymalizacji.
LoadAndDelete
LoadAndDelete atomowo wczytuje wartość i usuwa klucz, zwracając poprzednią wartość oraz informację, czy klucz istniał.
v, loaded := m.LoadAndDelete("key")
if loaded { fmt.Println("deleted:", v) }sync.Map nie jest generyczna
Wartości przechowywane w sync.Map mają typ any. Opakuj sync.Map w typowaną strukturę z metodami bezpiecznymi typowo, aby uniknąć rozproszonych asercji typów w bazie kodu.
Szybki test
Co gwarantuje sync.Once?
Podsumowanie: sync.Once i sync.Map
Najważniejsze informacje:
- sync.Once: wykonuje funkcję dokładnie raz i jest nieodwracalny
- sync.Map: współbieżna mapa zoptymalizowana pod kątem wzorców z przewagą odczytów lub rozłącznymi kluczami
- Dla bezpieczeństwa używaj typowanych opakowań wokół sync.Map
Często zadawane pytania
Czy lekcja „sync.Once i sync.Map” jest bezpłatna?
Tak — pełny tekst „sync.Once i sync.Map” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Go Academy, przejdź na CoddyKit PRO. Kurs Go Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „sync.Once i sync.Map”?
Jednorazowa inicjalizacja i współbieżne mapy Ćwiczysz Go Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Go Academy?
Nie wymagamy żadnego doświadczenia. Go Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.
Ile czasu zajmuje lekcja „sync.Once i sync.Map”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Go Academy?
Tak. Każda lekcja Go Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- sync.Mutex i sync.RWMutex
- sync.WaitGroup
- sync.Once i sync.Map
- Detektor wyścigów i bezpieczne wzorce