sync.Once.Do(f func())

sync.Once.Do(f func())是一个挺有趣的东西,能保证once只执行一次,无论你是否更换once.Do(xx)这里的方法,这个sync.Once块只会执行一次。

  1. package main  
  2.   
  3. import (  
  4.     "fmt"  
  5.     "sync"  
  6.     "time"  
  7. )  
  8.   
  9. var once sync.Once  
  10.   
  11. func main() {  
  12.   
  13.     for i, v := range make([]string, 10) {  
  14.         once.Do(onces)  
  15.         fmt.Println("count:", v, "---", i)  
  16.     }  
  17.     for i := 0; i < 10; i++ {  
  18.   
  19.         go func() {  
  20.             once.Do(onced)  
  21.             fmt.Println("213")  
  22.         }()  
  23.     }  
  24.     time.Sleep(4000)  
  25. }  
  26. func onces() {  
  27.     fmt.Println("onces")  
  28. }  
  29. func onced() {  
  30.     fmt.Println("onced")  
  31. }  

整个程序,只会执行onces()方法一次,onced()方法是不会被执行的。

原文地址:https://www.cnblogs.com/lvdongjie/p/6566320.html