乐趣区

关于go:go语言源码阅读syncOnce

一、介绍

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 变量范畴内,只执行一次。

三、源码浏览

退出移动版