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