1. sync.Once的功用是什么?
A. 只执行ㄧ次函数。
更具体说,需要执行函数的时候,呼叫sync.Once的Do方法,该方法就会执行函数,且只执行一次
B. sync.Once类型属于结构体类型,为开箱即用。此类型包含sync.Mutex的字段。
type Once struct {m Mutexdone uint32}
C. 这个类型的Do方法,只接受一个参数,而这个参数的类型必须是func(),无参数和结果声明的函数。
2. Do方法的功能,并不是对每一种参数函数都只执行ㄧ次,而是只执行"第一次被调用传入"的函数,并且之后不会再执行任何参数函数。
如果,有多个只需要执行ㄧ次的函数,就必须为它们每一个都写一个sync.Once类型的值。
3. 程式码範例
package mainimport ( "fmt" "sync" "sync/atomic")func main() { var counter uint32 var once sync.Once once.Do(func() { atomic.AddUint32(&counter, 1) }) fmt.Printf("The counter: %d\n", counter) once.Do(func() { // 没有执行。上面已经用过这个Once类型的变数,就不会再执行 atomic.AddUint32(&counter, 2) }) fmt.Printf("The counter: %d\n", counter) var once2 sync.Once // 想要再执行其它函数,就必须再写一个sync.Once类型的变数 once2.Do(func() { atomic.AddUint32(&counter, 5) }) fmt.Printf("The counter: %d\n", counter)}
https://play.golang.org/p/P5jBkCzr1LB
参考来源:
郝林-Go语言核心36讲
https://github.com/hyper0x/Golang_Puzzlers
https://golang.org/pkg/cmd/go/internal/test/