🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] ## 题目一 使用 goroutine 和 channel 实现一个计算int64随机数各位数和的程序,例如生成随机数61345,计算其每个位数上的数字之和为19。 1. 开启一个 goroutine 循环生成int64类型的随机数,发送到jobChan 2. 开启24个 goroutine 从jobChan中取出随机数计算各位数的和,将结果发送到resultChan 3. 主 goroutine 从resultChan取出结果并打印到终端输出 ```go package main import ( "fmt" "math" "math/rand" "sync" "time" ) /* randomNumGen 生成int32范围为的随机数,取值范围[0-2147483647) */ func randomNumGen(jch chan int, swg *sync.WaitGroup) { defer swg.Done() rand.Seed(time.Now().UnixMilli()) num := rand.Intn(math.MaxInt32) jch <- num } /* calcSum 计算每一位数之和。例如生成随机数61345,计算其每个位数上的数字之和为19。 */ func calcSum(jch chan int, rch chan int, swg *sync.WaitGroup) { defer swg.Done() sum := 0 i := <-jch fmt.Printf("Deal with %d\n", i) for { if i > 0 { // 累加个数和 sum += i % 10 // 10地板除,相当于把个位数删掉 i /= 10 } else { // 等于0时,退出死循环 break } } rch <- sum } func main() { var swg sync.WaitGroup var once sync.Once jobChan := make(chan int, 3) resultChan := make(chan int, 3) // 开启一个 goroutine 循环生成int64类型的随机数,发送到jobChan swg.Add(1) go randomNumGen(jobChan, &swg) // 开启24个 goroutine 从jobChan中取出随机数计算各位数的和,将结果发送到resultChan swg.Add(1) for i := 0; i < 24; i++ { go once.Do(func() { calcSum(jobChan, resultChan, &swg) }) } // 等待goroutine执行完毕 swg.Wait() // 主 goroutine 从resultChan取出结果并打印到终端输出 fmt.Println("sum", <-resultChan) } // 运行结果 // Deal with 385831658 // sum 47 ```