package main
import (
"fmt"
)
// 定义一个读取numChan管道的函数
// read data 传入三个管道 numChan chan int, resChan chan map[int]int, exitChan chan bool
func readData(numChan chan int, resChan chan map[int]int, exitChan chan bool) {
// 开始读取并写入
for true {
// 这里的v就需要我们要循环累加的值
v, ok := <-numChan
if !ok {
break
}
//定义一个初始遍变量 来接收总和
resNum := 0
for i := 1; i <= v; i++ {
resNum += i
}
// 定义一个map 并把等到值赋值map
resChan <- map[int]int{v: resNum}
}
exitChan <- true
}
func main() {
// 要求
// 1. 启动一个协程,将1-2000的数放入到一个channel中,比如numChan
// 2. 启动八个协程,从numChan 取出数(比如n),并计算1+...+n的值,并存放到resChan
// 3. 最后8个协程协同完成工作后,在遍历resChan,显示结果[如 res[1] = 1]...res[10] = 55...]
// 4. 注意:考虑resChan chan int是否合适
// 定义三个管道
numChan := make(chan int, 2000) // 需要计算的值
resChan := make(chan map[int]int, 2000) // 来存储计算过后的值
exitChan := make(chan bool, 8) //用来判断所有协程对于resChan写入操作是否完成
// 这里就是用匿名函数写入数值
go func() {
for i := 1; i < 2000; i++ {
numChan <- i
}
close(numChan)
}()
// 这里同时开启八个协程
for i := 0; i < 8; i++ {
go readData(numChan, resChan, exitChan)
}
// 这里取出exitChan里面的状态
for i := 0; i < 8; i++ {
<-exitChan
}
close(exitChan)
// 读取完之后关闭
close(resChan)
// 遍历resChan管道
for v := range resChan {
// 注意:这里的v是个map
for k, v := range v {
fmt.Printf("k[%v]=%v \n", k, v)
}
}
}
golang 1. 启动一个协程,将1-2000的数放入到一个channel中,比如numChan 2. 启动八个协程,从numChan 取出数(比如n),并计算1+...+n的值
于 2023-07-04 17:37:31 首次发布