sync.Once解析

有时候我们某个函数只需要运行一次,我们可以使用sync.Once来保证,参考代码:

package main

import (
    "fmt"
    "sync"
)

func main() {
    initFunc := func() {
        fmt.Println("init func must run once")
    }
    var once sync.Once
    done := make(chan bool)
    for i := 0; i < 10; i++ {
        go func(i int) {
            fmt.Println(i)
            once.Do(initFunc)
            done <- true
        }(i)
    }
    for i := 0; i < 10; i++ {
        <-done
    }
}

当我们仅仅想运行一次initFunc时候,可以用sync.Once来运行。比如获取单例实例。