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)
}

参考:https://www.cnblogs.com/xinliangcoder/p/11286801.html

https://blog.csdn.net/yugongpeng_blog/article/details/43530771?utm_campaign=studygolang.com&utm_medium=studygolang.com&utm_source=studygolang.com

原文地址:https://www.cnblogs.com/pu369/p/12856622.html