• 使用 go.uber.org/atomic

    使用 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. }