一、介绍

sync.Once是 Go 规范库提供的使函数只执行一次的实现,常利用于单例模式,例如初始化配置、放弃数据库连贯等。作用与 init 函数相似,但有区别。

  • init函数是package包被首次加载的时候,初始化应用。
  • sync.Once能够在任意地位,全局中执行一次。

sync.Once源码在 src/sync/once.go
咱们用 go doc sync.once 来整体看一下

type Once struct {}func (o *Once) Do(f func())

能够看到只有一个 sync.Once 构造体,以及一个执行的办法 Once.Do().

二、应用

func TestOnce(t *testing.T) {    //1 申明一个 sync.Once变量    var once sync.Once    for i := 0; i < 10; i++ {        go func() {            //2 应用Do()执行首次仅只有一次操作            once.Do(func() {                fmt.Println("hi")            })        }()    }    time.Sleep(time.Second)}

备注:须要留神sync.Once的变量范畴,比方这个变量范畴在 TestOnce()函数外面,所以在其余的中央,还是能够调用fmt.Println("hi")函数的。仅是在这个函数里,调用一次。
这里的仅执行一次是在 sync.Once 变量范畴内,只执行一次。

三、源码浏览