0Pricing
Go Academy · Lekcja

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

  1. sync.Mutex i sync.RWMutex
  2. sync.WaitGroup
  3. sync.Once i sync.Map
  4. Detektor wyścigów i bezpieczne wzorce
← Powrót do Go Academy