sync.one介绍
syncy.one的库提供的函数只执行一次,如配置文件,数据库连接等
下面是哟个dome
package main
import (
"log"
os "os"
"strconv"
"sync"
"time"
)
// 初始化配置文件的操作
type Config struct {
Server string
Port int64
}
var (
once sync.Once
config *Config
)
func ReadConfig() *Config {
once.Do(func() {
var err error
config = &Config{
Server: os.Getenv("Server"),
}
config.Port, err = strconv.ParseInt(os.Getenv("Port"), 10, 0)
if err != nil {
config.Port = 8080
}
// 只会打印一次
log.Println("init config")
})
return config
}
func main() {
for i := 0; i < 10; i++ {
go func() {
_ = ReadConfig()
}()
time.Sleep(time.Second)
}
}
sync.one内部的一个实现
package sync
import (
"sync/atomic"
)
type Once struct {
done uint32
m Mutex
}
func (o *Once) Do(f func()) {
if atomic.LoadUint32(&o.done) == 0 {
o.doSlow(f)
}
}
func (o *Once) doSlow(f func()) {
o.m.Lock()
defer o.m.Unlock()
if o.done == 0 {
defer atomic.StoreUint32(&o.done, 1)
f()
}
}