在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、延迟初始化可以提高系统的启动速度。
还没有评论,来说两句吧...