背景:
近期在开发项目的时候,发现有的需求需要进行初始化,但是初始化的时刻不同,简单讲就是文本加载自动初始化,那就是最常见的init方式,同时Go还提供了一个新的方式,那就是sync包提供的方式: sync.Once ,最终的效果都是只执行一次。
方法名 | 相同点 | 不同点 |
init() | 最终执行次数都是一次 | 加载到指定文件的时候会自动的执行该文件的init方法 |
sync.Once | \ | 执行该方法的时候才会触发执行一次,其他时刻调用不会执行。同时自带并发安全,可以放心使用。 |
测试: 下面主要进行测试sync.Once方法,init方式太简单了,自行百度。
func main() {
logger.Info("-------------初始化sync.Once方法--------------")
var once sync.Once
onceBody := func() {
fmt.Println("Only once Success !")
}
for i := 0; i < 10; i++ {
H(&once, onceBody, i+1)
}
}
func H(once *sync.Once, onceBody func(), i int) {
fmt.Println("启动sync.Once函数第: ", i, " 次")
once.Do(onceBody)
time.Sleep(100)
}
执行效果:
启动sync.Once函数第: 1 次
Only once Success !
启动sync.Once函数第: 2 次
启动sync.Once函数第: 3 次
启动sync.Once函数第: 4 次
启动sync.Once函数第: 5 次
启动sync.Once函数第: 6 次
启动sync.Once函数第: 7 次
启动sync.Once函数第: 8 次
启动sync.Once函数第: 9 次
启动sync.Once函数第: 10 次
综上所述就是关于Go初始化那些事的简单介绍。