Sobes.tech
Назад к вопросам
Junior — Middle
79

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

Ответ от нейросети

sobes.tech AI

В Go для безопасного увеличения счетчика вызовов внутри структуры при работе с несколькими потоками (горутнами) обычно используют пакет sync.

Самый простой способ — использовать sync.Mutex для блокировки доступа к полю счетчика:

import "sync"

type Counter struct {
    mu    sync.Mutex
    count int
}

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

func (c *Counter) Value() int {
    c.mu.Lock()
    defer c.mu.Unlock()
    return c.count
}

Другой способ — использовать атомарные операции из пакета sync/atomic, которые позволяют увеличить значение без явной блокировки:

import (
    "sync/atomic"
)

type Counter struct {
    count int64
}

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

func (c *Counter) Value() int64 {
    return atomic.LoadInt64(&c.count)
}

Использование атомарных операций предпочтительно, если нужно просто увеличить счетчик без других сложных операций, так как это эффективнее по производительности.