go 不要通过共享内存来通信,相反,应该通过通信来共享内存
例子1:
5个学生交作业,老师收到一个,批改一个,并公布分数
package main import ( "crypto/rand" "fmt" "math/big" ) func 交作业(ch chan int64) { n, _ := rand.Int(rand.Reader, big.NewInt(100)) ch <- n.Int64() } func 批改作业(N int) { ch := make(chan int64, 1) for i := 0; i < N; i++ { go 交作业(ch) } for i := 0; i < N; i++ { fmt.Println(<-ch) } } func main() { 批改作业(5) }
例子2:
5个学生交作业,老师收齐后,进行批改,并公布分数
package main import ( "crypto/rand" "fmt" "math/big" "sync" ) func 交作业(ch chan int64) { n, _ := rand.Int(rand.Reader, big.NewInt(100)) ch <- n.Int64() wg.Done() } func 批改作业(ch chan int64) { for i := 0; i < cap(ch); i++ { wg.Add(1) go 交作业(ch) } wg.Wait() //统一批改 for i := 0; i < cap(ch); i++ { fmt.Println(<-ch) } } var wg = new(sync.WaitGroup) func main() { N := 5 ch := make(chan int64, N) //用于存放N个学生的成绩 批改作业(ch) }