以下是Go语言中sync.Once代码示例:
package main
import (
"fmt"
"sync"
)
// 定义一个全局变量
var globalVar string
// 定义一个DoOnce函数,只能被执行一次
func DoOnce() {
fmt.Println("执行 DoOnce 函数")
globalVar = "Hello, world!"
}
func main() {
var once sync.Once
// 多次调用Do函数,但只有第一次成功执行
for i := 0; i < 5; i++ {
once.Do(DoOnce)
fmt.Println("第", i, "次调用Do函数")
}
// 输出全局变量
fmt.Println("全局变量:", globalVar)
}
运行结果:
执行 DoOnce 函数
第 0 次调用Do函数
第 1 次调用Do函数
第 2 次调用Do函数
第 3 次调用Do函数
第 4 次调用Do函数
全局变量: Hello, world!
从上面的运行结果可以看出,DoOnce函数只被执行了一次,全局变量globalVar也只被初始化了一次。而且多次调用Do函数并没有影响程序的正确性。这就是sync.Once的作用。它可以保证某些代码只被执行一次,而且它是并发安全的。