Skip to content

Instantly share code, notes, and snippets.

@fpawel
Created March 23, 2026 20:00
Show Gist options
  • Select an option

  • Save fpawel/0b31b5d70338767f5a463784fbb679b6 to your computer and use it in GitHub Desktop.

Select an option

Save fpawel/0b31b5d70338767f5a463784fbb679b6 to your computer and use it in GitHub Desktop.
sync_map_test.go
// 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