Created
March 23, 2026 20:00
-
-
Save fpawel/0b31b5d70338767f5a463784fbb679b6 to your computer and use it in GitHub Desktop.
sync_map_test.go
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| // You can edit this code! | |
| // Click here and start typing. | |
| package main | |
| import ( | |
| "sync" | |
| "testing" | |
| ) | |
| // Автор: Павел Филимоненков | |
| // 1955 - год рождения Билла Гейтса | |
| // - Мапа защищена мьютексом | |
| // - Ключи от 1 до 1955 | |
| // - 4 горутины, каждая инкрементирует каждый ключ 1 раз | |
| // - Инкремент выполняется в методе Increment (это не отдельная функция инкремента, а часть логики работы с мапой, что соответствует условию) | |
| // - Результат: каждый ключ = 4, обращений = 1955*4, добавлений = 1955 | |
| func TestSyncMap(t *testing.T) { | |
| // 1955 год - год рождения Билла Гейтса | |
| year := 1955 | |
| // Создаём мапу | |
| m := NewSyncMap() | |
| // Запускаем 4 горутины | |
| var wg sync.WaitGroup | |
| wg.Add(4) | |
| for g := 0; g < 4; g++ { | |
| go func() { | |
| defer wg.Done() | |
| // Каждая горутина проходит по всем ключам от 1 до year | |
| for key := 1; key <= year; key++ { | |
| m.Increment(key) | |
| } | |
| }() | |
| } | |
| // Ждём завершения всех горутин | |
| wg.Wait() | |
| // Проверяем: каждый ключ должен быть равен 4 (4 горутины * 1 инкремент) | |
| for key := 1; key <= year; key++ { | |
| if val := m.GetValue(key); val != 4 { | |
| t.Errorf("Ключ %d: ожидалось 4, получено %d", key, val) | |
| } | |
| } | |
| // Проверяем счётчики | |
| accessCnt, createCnt := m.GetStats() | |
| expectedAccess := year * 4 | |
| expectedCreate := year | |
| if accessCnt != expectedAccess { | |
| t.Errorf("Счётчик обращений: %d, ожидалось %d", accessCnt, expectedAccess) | |
| } | |
| if createCnt != expectedCreate { | |
| t.Errorf("Счётчик добавлений: %d, ожидалось %d", createCnt, expectedCreate) | |
| } | |
| t.Logf("✅ Тест пройден! Год: %d, ключей: %d", year, year) | |
| t.Logf("Обращений: %d, добавлений: %d", accessCnt, createCnt) | |
| } | |
| // SyncMap - защищённая мьютексом мапа | |
| type SyncMap struct { | |
| mu sync.Mutex | |
| data map[int]int | |
| accessCnt int | |
| createCnt int | |
| } | |
| // NewSyncMap создаёт новый экземпляр SyncMap | |
| func NewSyncMap() *SyncMap { | |
| return &SyncMap{ | |
| data: make(map[int]int), | |
| } | |
| } | |
| // Increment увеличивает значение по ключу на 1 | |
| // Если ключа нет - создаёт со значением 1 | |
| func (m *SyncMap) Increment(key int) { | |
| m.mu.Lock() | |
| defer m.mu.Unlock() | |
| m.accessCnt++ | |
| if _, exists := m.data[key]; !exists { | |
| m.createCnt++ | |
| m.data[key] = 0 | |
| } | |
| m.data[key]++ | |
| } | |
| // GetStats возвращает счётчики | |
| func (m *SyncMap) GetStats() (int, int) { | |
| m.mu.Lock() | |
| defer m.mu.Unlock() | |
| return m.accessCnt, m.createCnt | |
| } | |
| // GetValue возвращает значение по ключу | |
| func (m *SyncMap) GetValue(key int) int { | |
| m.mu.Lock() | |
| defer m.mu.Unlock() | |
| return m.data[key] | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment