2021-05-09

package main

import (
	"fmt"
	"math/rand"
	"sync"
	"time"
)

/*
一、使用goroutine和channel实现一个计算int64随机数各位数和的程序。
		1.开启一个goroutine循环生成int64类型的随机数,发送到jobChan
		2.开启24个goroutine从jobChan中取出随机数计算各位数的和,将结果发送到resultChan
		3.主goroutine从resultChan取出结果并打印到终端输出
*/
//job....
type job struct {
	value int64
}

//result.....
type result struct {
	job *job
	sum int64
}

var jobChan = make(chan *job, 100)
var resultChan = make(chan *result, 100)
var wg sync.WaitGroup

func randNum(ra chan<- *job) {
	defer wg.Done()
	// 循环生成int64类型的随机数,发送到jobChan
	for {
		x := rand.Int63()
		newJob := &job{
			value: x,
		}
		ra <- newJob
		time.Sleep(time.Millisecond * 500)
	}
}

func addSum(ra <-chan *job, res chan<- *result) {
	defer wg.Done()
	// 从jobChan中取出随机数计算各位数的和,将结果发送到resultChan
	for {
		job := <- ra
		sum := int64(0)
		n := job.value
		for n > 0 {
			sum += n % 10
			n = n / 10
		}
		newResult := &result{
			job: job,
			sum: sum,
		}
		res <- newResult
	}
}

func main() {
	wg.Add(1)
	go randNum(jobChan)
	// 开启24个goroutine
	wg.Add(24)
	for i := 0; i < 24; i++ {
		go addSum(jobChan, resultChan)
	}
	// 主goroutine从resultChan取出结果并打印到终端输出
	for res := range resultChan {
		fmt.Printf("value:%d sum:%d\n", res.job.value, res.sum)
	}
	wg.Wait()
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值