package main import ( "fmt" "math/rand" "sync" "time" ) //使用 goroutine 和 channel 实现一个计算int64随机数各位数和的程序,例如生成随机数61345,计算其每个位数上的数字之和为19。 //开启一个 goroutine 循环生成int64类型的随机数,发送到jobChan //开启24个 goroutine 从jobChan中取出随机数计算各位数的和,将结果发送到resultChan //主 goroutine 从resultChan取出结果并打印到终端输出 var w sync.WaitGroup type job struct { value int64 } type Result struct { job *job sum int64 } var jobChan = make(chan *job, 100) var resultChan = make(chan *Result, 100) func producer(prod chan<- *job) <-chan *job { defer w.Done() for { x := rand.Int63() newJob := &job{value: x} jobChan <- newJob time.Sleep(time.Millisecond * 500) } } func consumer(con chan<- *Result, prod <-chan *job) { defer w.Done() for { v := <-prod sum := int64(0) n := v.value for n > 0 { sum += n % 10 n = n / 10 } newResult := &Result{job: v, sum: sum} con <- newResult } } func main() { w.Add(1) go producer(jobChan) w.Add(24) for i := 0; i < 24; i++ { go consumer(resultChan, jobChan) } for i := range resultChan { fmt.Printf("随机数为:%d,加和为:%d\n", i.job.value, i.sum) } w.Wait() }