================================
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 synconce
import (
"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
213
Process 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只执行一次。