题目:
使用goroutine和channel实现-一个计算int64随机数各位数和的程序。
1.开启一个goroutine循环生成int64类型的随机数,发送到jobChan
2.开启3个goroutine从jobChan中取出随机数计算各位数的和,将结果发送到resultChan
3.主goroutine从resultChan取出结果并打印到终端输出
解答:
type job struct {
number int64
}
type worker struct {
job *job
res int64
i int
}
var jobChan = make(chan *job,100)
var resultChan = make(chan *worker,100)
var wg sync.WaitGroup
var once sync.Once
//开启一个goroutine循环生成int64类型的随机数,发送到jobChan
func create(jobChan chan<- *job ) {
defer wg.Done()
for i:=0; i<10; i++ {
num := rand.Int63()
newJob := &job{
num,
}
jobChan<- newJob
time.Sleep(time.Millisecond*500)
}
close(jobChan)
}
//开启3个goroutine从jobChan中取出随机数计算各位数的和,将结果发送到resultChan
func count(jobChan <-chan *job,resultChan chan<- *worker,i int) {
defer wg.Done()
job, ok := <-jobChan
for ok{
sum:=int64(0)
n:=job.number
for n>0{
sum+=n%10
n=n/10
}
newWork := &worker{
job: job,
res: sum,
i:i,
}
resultChan<- newWork
job,ok = <-jobChan
}
once.Do(func() {close(resultChan)})
}
//主goroutine从resultChan取出结果并打印到终端输出
func main() {
wg.Add(1)
go create(jobChan)
wg.Add(3)
for i:=1; i<=3; i++ {
go count(jobChan,resultChan,i)
}
for result:=range resultChan{
fmt.Printf("随机数为:%v,随机数各位和为:%v,这是第%v个协程:\n",result.job.number,result.res,result.i)
}
wg.Wait()
}