How do I use atomic operations from sync/atomic in Go?

Atomic operations are a way to safely modify variables shared between multiple goroutines in Go. The `sync/atomic` package provides low-level atomic operations for synchronizing access to variables without using explicit locks.

Using atomic operations can greatly improve performance by avoiding the overhead associated with locks. This is particularly useful in scenarios requiring high concurrency.

Example of Using Atomic Operations

package main

import (
    "fmt"
    "sync"
    "sync/atomic"
)

func main() {
    var counter int64 // The shared counter

    var wg sync.WaitGroup
    numGoroutines := 100

    for i := 0; i < numGoroutines; i++ {
        wg.Add(1)
        go func() {
            // Increment the counter atomically
            atomic.AddInt64(&counter, 1)
            wg.Done()
        }()
    }

    wg.Wait() // Wait for all goroutines to finish
    fmt.Println("Final counter:", counter) // Should print 100
}
    

atomic operations Go goroutines sync package concurrency synchronization