本文主要是介绍golang sync.Once介绍,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
================================
go grpc-go 相关技术专栏 总入口
go语言基础知识总结、整理、收藏
================================
1、sync.Once.Do(f func())作用? |
能保证sync.Once.Do只执行一次,
无论是否更换sync.Once.Do(f func())里的函数
这个sync.Once块只会执行一次。
2、sync.Once.Do(f func())使用场景? |
如:
服务启动的时候:
- 链接mysql数据库
- 对数据库表的创建操作
服务异常退出时
3、sync.Once.Do(f func()) 根据 init函数的区别 |
作用与 init 函数类似。但也有所不同。
init 函数是在 文件包首次被加载的时候执行,且只执行一次
sync.Onc 是在 代码运行中需要的时候执行,且只执行一次
4、单元测试用例 |
package synconceimport ("testing""fmt""time""sync"
)
var once sync.Once
func TestSyncOnce(t *testing.T) {for i:=0;i<2; i++ {once.Do(onces)fmt.Println("count:", i)}for i := 0; i < 2; i++ {go func() {once.Do(onced)fmt.Println("213")}()}time.Sleep(4000)
}func onces() {fmt.Println("---onces---")
}
func onced() {fmt.Println("---onced---")
}
测试结果:
=== RUN TestSyncOnce
---onces---
count: 0
count: 1
213
--- PASS: TestSyncOnce (0.00s)
PASS
213Process finished with exit code 0
从测试结果,可以看出来
sync.Once.Do只执行了一次。
先将onces函数扔给sync.Once.Do执行,
再重新将onced函数扔给sync.Once.Do执行,
当sync.Once.Do(f fun)里f更新后,也不再重新执行了。
即,在整个期间,sync.Once.Do只执行一次。
这篇关于golang sync.Once介绍的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!