使用 go.uber.org/atomic

Go 的 sync/atomic 包仅仅提供针对原始类型(int32, int64, …)的原子操作。因此,很容易忘记使用原子操作来读写变量。

go.uber.org/atomic 通过隐藏基础类型,使这些操作类型安全。并且,它还提供一个方便的 atomic.Bool 类型。

BadGood
  1. type foo struct {
  2. running int32 // atomic
  3. }
  4. func (f foo) start() {
  5. if atomic.SwapInt32(&f.running, 1) == 1 {
  6. // already running…
  7. return
  8. }
  9. // start the Foo
  10. }
  11. func (f foo) isRunning() bool {
  12. return f.running == 1 // race!
  13. }
  1. type foo struct {
  2. running atomic.Bool
  3. }
  4. func (f foo) start() {
  5. if f.running.Swap(true) {
  6. // already running…
  7. return
  8. }
  9. // start the Foo
  10. }
  11. func (f foo) isRunning() bool {
  12. return f.running.Load()
  13. }