当前位置: 代码迷 >> 综合 >> chan练习
  详细解决方案

chan练习

热度:16   发布时间:2024-03-09 06:55:34.0

使用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()
}

 

  相关解决方案