【转】go语言:sync.Once的用法
-------------
sync.Once.Do(f func())是一个挺有趣的东西,能保证once只执行一次,无论你是否更换once.Do(xx)这里的方法,这个sync.Once块只会执行一次。
package main import ( "fmt" "sync" "time" ) var once sync.Once func main() { for i, v := range make([]string, 10) { once.Do(onces) fmt.Println("count:", v, "---", i) } for i := 0; i < 10; i++ { go func() { once.Do(onced) fmt.Println("213") }() } time.Sleep(time.Second*1) } func onces() { fmt.Println("onces") } func onced() { fmt.Println("onced") }
整个程序,只会执行onces()方法一次,onced()方法是不会被执行的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | package main import ( "fmt" "sync" "time" ) var once sync.Once func main() { for i, v := range make([]string, 10) { once.Do(onces) fmt.Println( "count:" , v, "---" , i) } for i := 0; i < 10; i++ { go func (i int) { once.Do(onced) fmt.Println( "213" , "---" , i) }(i) } time.Sleep(time.Second * 1) } func onces() { fmt.Println( "onces" ) } func onced() { fmt.Println( "onced" ) } |
--------------
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | package singleton import ( "unsafe" "fmt" "sync" "testing" ) //协程安全 单例模式 type Singleton struct { } var singleintance *Singleton var once sync.Once //只执行一次 func GetSingletonObj() *Singleton { once.Do( func () { fmt.Println( "Create Obj" ) singleintance = new(Singleton) }) return singleintance } func TestGetSingletonObj(t *testing.T) { var wg sync.WaitGroup //协程安全 for i := 0; i < 10; i++ { wg.Add(1) go func () { obj := GetSingletonObj() fmt.Printf( "%x\n" ,unsafe.Pointer(obj)) //输出的结果都是同一个地址 wg.Done() }() } wg.Wait() //等待是有协程运行完成 } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
2017-09-13 【转】php ob_start()、ob_end_flush和ob_end_clean()多级缓冲
2016-09-13 angularJS 系列(三)- 自定义 Service