Once 可以用来执行仅仅执行一次的动作,常常被应用于单个对象的初始化场景。
1. Once 的使用方法
sync.Once 只暴露了一个方法 Do,你可以多次调用 Do 方法,但是只有第一次调用 Do 方法时参数 f 才会执行,这里的 f 是一个无参数、无返回值的函数。
func (o *Once) do(f func())
当且仅当第一次调用 Do 方法时参数 f 才会执行,即使第二次、第三次、...、第 n 次调用时参数 f的值不一样,它也不会执行。比如下面的例子,虽然 f1 和 f2 是不同的函数,但是第二个函数 f2 不会执行。
package mainimport ("fmt""sync"
)func main() {var once sync.Once//第一个初始化函数f1 := func() {fmt.Println("in f1")}once.Do(f1) // 打印出 "in f1"//第二个初始化函数f2 := func() {fmt.Println("in f2")}once.Do(f2) //无输出
}
输出结果如下:
in f1
因为这里的参数 f 是一个无参数、无返回值的函数,所以你可能会通过闭包的方式引用外面的参数。例如:
var addr = "baidu"var conn net.com
var