golang sync包下的Once是多线程开始之前先执行,并且仅执行一次的方法。可以考虑用来做一些初始化操作。
package main import ( "fmt" "sync" "time" ) var counter int = 0 func main() { var once sync.Once onceBody := func() { time.Sleep(3e9) fmt.Println("Only once") } done := make(chan bool) for i := 0; i < 10; i++ { j := i go func(int) { once.Do(onceBody) fmt.Println(j) done <- true }(j) } for i := 0; i < 10; i++ { <-done } }
输出结果:
Only once 0 1 2 3 4 5 6 7 8 9