在java语言里面我们知道有一个懒加载的机制,也就是这个变量或者类,只有当用的时候才会进行初始化,而不是在最开始就直接初始化把资源给占用了。在go语言中也有懒加载的机制,就是这个:Sync.Once。
这个Sync.Once函数就提供了延迟加载的功能,它的主要结构和方法如下:
type Once struct {
//结构体内的变量都是包外不可见的
m Mutex
done uint32
}
func (o *Once) Do(f func())从上面的结构中可以看到只要我们向这个Do方法传递想要初始化的函数,他才会执行,下面我们使用案例演示下:
package main
import (
"fmt"
"sync"
)
func initPrint() {
fmt.Println("初始化了一次函数")
}
func main() {
num := 10
var wg sync.WaitGroup
var once sync.Once
for i := 0; i < num; i++ {
wg.Add(1)
go func(i int) {
defer wg.Done()
once.Do(initPrint)
}(i)
}
wg.Wait()
}上面的案例我们就演示了懒加载的现象,同时运行下看看结果:
可以看到我们启动了10个线程,最后只执行了一次。这其实就是sync.Once结构里面的done uint32起的作用。也就是只要被执行一次之后,再也不会进行重复执行。
备注:
1、sync.Once使用范围一般是懒加载某个方法,需要向这个do里面传递。
2、sync.Once能保证我们的方法只被执行一次,不会进行重复执行。
3、延迟初始化可以提高系统的启动速度。










还没有评论,来说两句吧...