golang技巧篇

golang atomic.Value用法

2022-12-06  本文已影响0人  _yun
package main

import (
    "log"
    "sync"
    "sync/atomic"
)

type Config struct {
    a []int
}

func main() {
    var v atomic.Value
    v.Store(&Config{}) // 这行不能省
    go func() {
        i := 0
        for {
            i++
            /*
              错误示范
              cfg.a = []int{i, i + 1, i + 2, i + 3, i + 4, i + 5}
            */
            cfg := &Config{a: []int{i, i + 1, i + 2, i + 3, i + 4, i + 5}}
            v.Store(cfg)
        }
    }()

    var wg sync.WaitGroup
    for n := 0; n < 4; n++ {
        wg.Add(1)
        go func() {
            for n := 0; n < 100; n++ {
                cfg := v.Load().(*Config)
                log.Printf("%v\n\n", cfg)
            }
            wg.Done()
        }()
    }
    wg.Wait()
}

总结:

atomic.Value提供了一种自定义变量类型的原子操作, 读: v.Load().(*Config), 写: v.Store(cfg), 并且初始化 var v atomic.Value 后, 需要指定v的读写类型, 即 v.Store(&Config{})

上一篇下一篇

猜你喜欢

热点阅读