Как сделать потокобезопасный инкремент количества вызовов внутри структуры в Go

«Как сделать потокобезопасный инкремент количества вызовов внутри структуры в Go» — вопрос из категории Golang, который задают на 23% собеседований Golang Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Используйте sync.Mutex или sync/atomic для потокобезопасного инкремента.

С Mutex:

type Counter struct {
    mu    sync.Mutex
    count int
}

func (c *Counter) Increment() {
    c.mu.Lock()
    defer c.mu.Unlock()
    c.count++
}

С atomic (быстрее для простых операций):

type Counter struct {
    count int64
}

func (c *Counter) Increment() {
    atomic.AddInt64(&c.count, 1)
}

Выбор:

  • Mutex — если нужны сложные операции (например, инкремент + проверка условия).
  • atomic — для простых операций (инкремент, декремент).

Оба варианта гарантируют корректность при конкурентном доступе.