1. sync.Once的功用是什麽?
A. 只执行ㄧ次函数。
更具体说,需要执行函数的时候,呼叫sync.Once的Do方法,该方法就会执行函数,且只执行一次
B. sync.Once类型属於结构体类型,为开箱即用。此类型包含sync.Mutex的字段。
type Once struct {
m Mutex
done uint32
}
C. 这个类型的Do方法,只接受一个参数,而这个参数的类型必须是func(),无参数和结果声明的函数。
2. Do方法的功能,并不是对每一种参数函数都只执行ㄧ次,而是只执行"第一次被调用传入"的函数,并且之後不会再执行任何参数函数。
如果,有多个只需要执行ㄧ次的函数,就必须为它们每一个都写一个sync.Once类型的值。
3. 程序码范例
package main
import (
"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/
>>: 在Windows 10中更改Windows应用商店下载的位置
本系列文章同步发布於笔者网站 上一篇文章我们介绍了 Nova 的功能与其使用方法,本篇文章将会继续介...
今天我们要来学习如何把Sass切分支许多档案 这样会使我们比较容易管理 @import(汇入) 可将...
Mac Book Arm 文书工作如何呢? Mac Book Arm 我个人觉得非常适合文书或业务使...
我也...可以跟电脑娘说话吗 tags: IT铁人 首篇不会给大家太多压力,简单介绍我们写出来的程序...
前情提要 上回偷拿远距离初阶魔法攻击艾草。 艾草:「我看你拿魔法丢我丢得挺顺的了(╬•᷅д•᷄╬),...