golang 1. 启动一个协程,将1-2000的数放入到一个channel中,比如numChan 2. 启动八个协程,从numChan 取出数(比如n),并计算1+...+n的值

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

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值