- 自定义可原子操作的变量类型
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{})