在Go语言中,`sync.once` 是一个非常实用的同步结构,用于确保某个函数或代码块仅执行一次,无论有多少个 goroutine 同时尝试调用它。这在初始化共享资源或单例模式中尤为重要。
💡 `sync.Once` 的核心是一个内部标志位,用来记录是否已经执行过目标函数。它的方法 `Do` 接受一个函数作为参数,并保证该函数只被执行一次。例如:
```go
var once sync.Once
once.Do(initFunc)
```
🎯 使用场景包括:
- 数据库连接池初始化。
- 配置文件加载。
- 单例对象创建。
与其他同步机制(如互斥锁)相比,`sync.Once` 更高效且更简洁,因为它只允许函数执行一次,避免了反复加锁解锁的开销。
🚀 示例代码:
```go
package main
import (
"fmt"
"sync"
)
func main() {
var once sync.Once
fmt.Println("First call...")
once.Do(func() {
fmt.Println("Initializing...")
})
fmt.Println("Second call...")
}
```
运行结果会显示 `"Initializing..."` 仅出现一次。🎉
总之,`sync.Once` 是 Go 并发编程中的利器,能有效提升程序性能和安全性!✨