使用goroutine和channel实现一个计算int64随机数各位数和的程序:
1. 开启一个goroutine循环生成int64类型的随机数, 发送到jobChan;
2. 开启24个goroutine从jobChan中取出随机数计算各位数的和, 将结果发送到resultChan;
3.主goroutine从resultChan取出结果打印终端输出;
第一步:创建两个通道jobChan与resultChan:
type job struct {value int64
}type result struct {job * jobvalue int64
}var jobChan = make(chan *job, 100)
var resultChan = make(chan *result, 100)
第二步:创建一个函数, 用来自动生成int64类型随机数, 并发送到jobChan通道中:
func batac(bc chan <- *job) {defer wg.Done()for{x := rand.Int63()jb := &job{value:x}bc <- jbtime.Sleep(time.Microsecond * 500)}
}
第三步:接收jobChan中的数据, 并且计算各位之和, 然后发送到resultChan中:
func jincao(jc <-chan *job, resultChan chan <- *result) {defer wg.Done()for{jb := <- jcvar sum int64 = 0n := jb.valuefor {if n > 0 {sum += n % 10n = n / 10}else{break}}ret := &result{job: jb,value: sum,}resultChan <- ret}
}
第四步: 在主goroutine中, 开启对应的任务, 并且打印输出:
var wg sync.WaitGroupfunc main() {wg.Add(1)go batac(jobChan)wg.Add(24)for i := 0; i < 24; i++ {go jincao(jobChan, resultChan)}for ret := range resultChan{fmt.Println("value:",ret.job.value,"__sum:",ret.value)}wg.Wait()
}