github.com/qiuhoude/go-web@v0.0.0-20220223060959-ab545e78f20d/prepare/14_concurrent/waitgroup/main2.go (about)

     1  package main
     2  
     3  import (
     4  	"fmt"
     5  	"sync"
     6  	"time"
     7  )
     8  
     9  type T struct {
    10  	V int
    11  }
    12  
    13  func (t *T) Incr(wg *sync.WaitGroup) {
    14  	t.V++
    15  	wg.Done()
    16  }
    17  func (t *T) Print() {
    18  	time.Sleep(1e9)
    19  	fmt.Print(t.V)
    20  }
    21  
    22  /*
    23  A: 输出12345678910
    24  B: 输出0123456789
    25  C: 输出9999999999 答案 why? 自己的分析是B
    26  D: 输出10101010101010101010
    27  */
    28  func main() {
    29  	var wg sync.WaitGroup
    30  	wg.Add(10)
    31  	var ts = make([]T, 10)
    32  	for i := 0; i < 10; i++ {
    33  		ts[i] = T{i}
    34  	}
    35  	for _, t := range ts {
    36  		go t.Incr(&wg)
    37  	}
    38  	wg.Wait()
    39  	for _, t := range ts {
    40  		go t.Print()
    41  	}
    42  	time.Sleep(5 * time.Second)
    43  }