[Golang]同步工具-sync包的Once-心智图总结

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

http://img2.58codes.com/2024/20131728oupFJlC9l8.png

参考来源:
郝林-Go语言核心36讲
https://github.com/hyper0x/Golang_Puzzlers
https://golang.org/pkg/cmd/go/internal/test/


关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章