Use go.uber.org/atomic
Atomic operations with the sync/atomic package operate on the raw types(int32
, int64
, etc.) so it is easy to forget to use the atomic operation toread or modify the variables.
go.uber.org/atomic adds type safety to these operations by hiding theunderlying type. Additionally, it includes a convenient atomic.Bool
type.
Bad | Good |
---|
- type foo struct {
- running int32 // atomic
- }
-
- func (f foo) start() {
- if atomic.SwapInt32(&f.running, 1) == 1 {
- // already running…
- return
- }
- // start the Foo
- }
- func (f foo) isRunning() bool {
- return f.running == 1 // race!
- }
|
- type foo struct {
- running atomic.Bool
- }
-
- func (f foo) start() {
- if f.running.Swap(true) {
- // already running…
- return
- }
- // start the Foo
- }
- func (f foo) isRunning() bool {
- return f.running.Load()
- }
|