Sobes.tech
Junior — Middle

Cum se implementează în mod sigur din punct de vedere al firelor creșterea unui contor de apeluri în interiorul unei structuri în limbajul Go?

sobes.tech AI

Răspuns de la 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)
}

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