- 开启一个 goroutine 循环生成int64类型的随机数,发送到
jobChan
- 开启24个 goroutine 从
jobChan
中取出随机数计算各位数的和,将结果发送到resultChan
- 主 goroutine 从
resultChan
取出结果并打印到终端输出
package main import ( "fmt" "math/rand" "strconv" "sync" "time" ) var ( wg sync.WaitGroup rwm sync.RWMutex jobChan chan int resultChan chan int ) func main() { jobChan = make(chan int) resultChan = make(chan int, 24) for i := 0; i < 24; i++ { wg.Add(2) go addNumber(jobChan, i) go CountNumber(jobChan, resultChan) go EchoResult(resultChan) } wg.Wait() } // 打印使用resultChan 否则无人接收行程死锁 func EchoResult(ch <-chan int) { num := <-ch fmt.Println(num) } // 添加随机数 只允许发送到通道 func addNumber(ch chan<- int, n int) { rwm.RLock() ch <- RandCreate(n) rwm.RUnlock() wg.Done() } // 获取并计算随机数 func CountNumber(ch1 chan int, ch2 chan<- int) { tmp, ok := <-ch1 //通道内无数据则关闭 并且返回 if !ok { close(ch1) return } sumNumber := SumNumber(tmp) ch2 <- sumNumber //打印原数字和结果 // fmt.Println(tmp, sumNumber) wg.Done() } // 计算各个位数之和 func SumNumber(n int) int { tmp := 0 number := strconv.Itoa(n) for i := 0; i <= len(number); i++ { j := 0 if i > 1 { j = i - 1 } num, _ := strconv.Atoi(number[j:i]) tmp = tmp + num } return tmp } // 随机数生成 func RandCreate(n int) int { rand.Seed(time.Now().UnixNano() + int64(n)) return rand.Intn(999999) }
使用 goroutine 和 channel 实现一个计算int64随机数各位数和的程序,例如生成随机数61345,计算其每个位数上的数字之和为19
最新推荐文章于 2024-09-05 17:46:16 发布