searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

跟大家分享一道做过的关于goroutine和channel的算法题

2023-05-29 03:17:33
38
0
题目:
使用goroutine和channel实现-一个计算int64随机数各位数和的程序。
1.开启一个goroutine循环生成int64类型的随机数,发送到jobChan
2.开启3个goroutine从jobChan中取出随机数计算各位数的和,将结果发送到resultChan
3.主goroutine从resultChan取出结果并打印到终端输出


解答:
type job struct {
number int64
}

type worker struct {
job *job
res int64
i int
}

var jobChan = make(chan *job,100)
var resultChan = make(chan *worker,100)
var wg sync.WaitGroup
var once sync.Once

//开启一个goroutine循环生成int64类型的随机数,发送到jobChan
func create(jobChan chan<- *job ) {
defer wg.Done()
for i:=0; i<10; i++ {
num := rand.Int63()
newJob := &job{
num,
}
jobChan<- newJob
time.Sleep(time.Millisecond*500)
}
close(jobChan)
}

//开启3个goroutine从jobChan中取出随机数计算各位数的和,将结果发送到resultChan
func count(jobChan <-chan *job,resultChan chan<- *worker,i int) {
defer wg.Done()
job, ok := <-jobChan
for ok{
sum:=int64(0)
n:=job.number
for n>0{
sum+=n%10
n=n/10
}
newWork := &worker{
job: job,
res: sum,
i:i,
}
resultChan<- newWork
job,ok = <-jobChan
}
once.Do(func() {close(resultChan)})
}

//主goroutine从resultChan取出结果并打印到终端输出
func main() {
wg.Add(1)
go create(jobChan)
wg.Add(3)
for i:=1; i<=3; i++ {
go count(jobChan,resultChan,i)
}
for result:=range resultChan{
fmt.Printf("随机数为:%v,随机数各位和为:%v,这是第%v个协程:\n",result.job.number,result.res,result.i)
}
wg.Wait()
}
0条评论
0 / 1000
林****宇
2文章数
0粉丝数
林****宇
2 文章 | 0 粉丝
林****宇
2文章数
0粉丝数
林****宇
2 文章 | 0 粉丝
原创

跟大家分享一道做过的关于goroutine和channel的算法题

2023-05-29 03:17:33
38
0
题目:
使用goroutine和channel实现-一个计算int64随机数各位数和的程序。
1.开启一个goroutine循环生成int64类型的随机数,发送到jobChan
2.开启3个goroutine从jobChan中取出随机数计算各位数的和,将结果发送到resultChan
3.主goroutine从resultChan取出结果并打印到终端输出


解答:
type job struct {
number int64
}

type worker struct {
job *job
res int64
i int
}

var jobChan = make(chan *job,100)
var resultChan = make(chan *worker,100)
var wg sync.WaitGroup
var once sync.Once

//开启一个goroutine循环生成int64类型的随机数,发送到jobChan
func create(jobChan chan<- *job ) {
defer wg.Done()
for i:=0; i<10; i++ {
num := rand.Int63()
newJob := &job{
num,
}
jobChan<- newJob
time.Sleep(time.Millisecond*500)
}
close(jobChan)
}

//开启3个goroutine从jobChan中取出随机数计算各位数的和,将结果发送到resultChan
func count(jobChan <-chan *job,resultChan chan<- *worker,i int) {
defer wg.Done()
job, ok := <-jobChan
for ok{
sum:=int64(0)
n:=job.number
for n>0{
sum+=n%10
n=n/10
}
newWork := &worker{
job: job,
res: sum,
i:i,
}
resultChan<- newWork
job,ok = <-jobChan
}
once.Do(func() {close(resultChan)})
}

//主goroutine从resultChan取出结果并打印到终端输出
func main() {
wg.Add(1)
go create(jobChan)
wg.Add(3)
for i:=1; i<=3; i++ {
go count(jobChan,resultChan,i)
}
for result:=range resultChan{
fmt.Printf("随机数为:%v,随机数各位和为:%v,这是第%v个协程:\n",result.job.number,result.res,result.i)
}
wg.Wait()
}
文章来自个人专栏
文章 | 订阅
0条评论
0 / 1000
请输入你的评论
0
0