能不能不用结构体写
关键点没想明白,做个记录。
使用goroutine和channel实现一个计算int64随机数各位数和的程序。
程序
package main
import (
"fmt"
"math/rand"
"sync"
"time"
)
// 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
//shuiJiShuChan 1.开启一个goroutine循环生成int64类型的随机数,发送到jobChan
func shuiJiShuChan(a chan<- *job) {
defer wg.Done()
//生成int64类型的随机数,发送到jobChan
for {
x := rand.Int63()
new1 := &job{
value: x,
}
a <- new1
time.Sleep(time.Millisecond * 1000)
}
}
// jieJue 从通道ch1读取数据,然后计算各个位数之和存入ch2中
func jieJue(ch1 <-chan *job, resultChan chan<- *result) {
defer wg.Done()
// 从jobChan中读取数据,然后计算各个位数之和存入resultChan中
for {
job := <-ch1
sum := int64(0)
n := job.value
for n > 0 {
sum += n % 10
n = n / 10
}
newResult := &result{
job: job,
sum: sum,
}
resultChan <- newResult
}
}
//使用goroutine和channel实现一个计算int64随机数各位数和的程序。
func main() {
wg.Add(1)
//1.开启一个goroutine循环生成int64类型的随机数,发送到jobChan
go shuiJiShuChan(jobChan)
//2.开启24个goroutine从jobChan中取出随机数计算各位数的和,将结果发送到resultChan
wg.Add(24)
for i := 0; i < 24; i++ {
go jieJue(jobChan, resultChan)
}
//3.主goroutine从resultChan取出结果并打印到终端输出
for result := range resultChan {
fmt.Println(result.job.value, result.sum)
}
wg.Wait()
}