在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
欢迎关注go语言微信公众号 每日go语言 golang_everyday
sync.once可以控制函数只能被调用一次。不能多次重复调用。示例代码:
package main
import ( "fmt" "sync" "time" )
func main() { o := &sync.Once{} go do(o) go do(o) time.Sleep(time.Second * 2) }
func do(o *sync.Once) { fmt.Println("Start do") o.Do(func() { fmt.Println("Doing something...") }) fmt.Println("Do end") }
输出结果: Start do Doing something... Do end Start do Do end 这里 Doing something 只被调用了一次。
查看go once的源码实现,也是非常的简单:
type Once struct { m Mutex done uint32 }
func (o *Once) Do(f func()) { if atomic.LoadUint32(&o.done) == 1 { return } // Slow-path. o.m.Lock() defer o.m.Unlock() if o.done == 0 { defer atomic.StoreUint32(&o.done, 1) f() } } 核心思想是使用原子计数记录被执行的次数。使用Mutex Lock Unlock锁定被执行函数,防止被重复执行。 |
请发表评论