funcmain(){const N =10var wg =&sync.WaitGroup{}for i :=0; i < N; i++{
wg.Add(1)// add 1 goroutine to WaitGroupgofunc(i int){println(i)defer wg.Done()//a goroutine finished}(i)}
wg.Wait()//wait util all goroutines finish}
功能:等待线程全部结束
wg.Wait()将会阻塞,如果还有要等待的线程
wg.Add()增加需要等待的线程数量
wg.Done()等待的线程结束,即wg.Add(-1)
数据竞争
问题代码
total, sum :=0,0for i :=1; i <=10; i++{
sum += i
gofunc(){
total += i
}()}
fmt.Printf("total:%d sum %d", total, sum)
解析
主协程会很快退出,子协程没有执行
数据竞争,多个子协程同时写total变量
“total += i” 中i的值是不确定的(不确定子协程会什么时候执行),执行时i很可能为11
改进代码
total,sum :=0,0
wg := sync.WaitGroup{}
mutex := sync.Mutex{}for i :=0; i <10; i++{
wg.Add(1)
sum += i
gofunc(i int){
mutex.Lock()
total += i
mutex.Unlock()
wg.Done()}(i)}
wg.Wait()
fmt.Printf("total:%d sum %d", total, sum)
2022-03-08 Marshaler接口
package main
import("encoding/json""fmt""time")funcmain(){
t :=struct{
time.Time
N int}{
time.Date(2020,12,20,0,0,0,0, time.UTC),5,}
m,_:= json.Marshal(t)
fmt.Printf("%s", m)}/*******************
打印的结果:"2020-12-20T00:00:00Z"