sync.Once

只执行一次,线程安全,适合用来实现单例

/**
* @Author: miguel.hou
* @Date: 2020/9/11
 */
package main

import (
    "fmt"
    "sync"
)

type DemoService struct {

}

var demoService *DemoService
var demoServiceOnce sync.Once

func getDemoService() *DemoService {
    fmt.Println("getDemoService .....")
    demoServiceOnce.Do(func() {
        fmt.Print("init service")
        demoService = &DemoService{}
    })

    return demoService
}

func main() {
    for i := 1; i < 10; i++ {
        demoService = getDemoService()
    }
}


输出

getDemoService .....
init servicegetDemoService .....
getDemoService .....
getDemoService .....
getDemoService .....
getDemoService .....
getDemoService .....
getDemoService .....
getDemoService .....
```