Назад к вопросам
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)
}
Использование атомарных операций предпочтительно, если нужно просто увеличить счетчик без других сложных операций, так как это эффективнее по производительности.