golang | 使用goroutine和channel实现一个计算int64随机数各位数和的程序。


能不能不用结构体写

关键点没想明白,做个记录。
使用goroutine和channel实现一个计算int64随机数各位数和的程序。

程序

package main

import (
	"fmt"
	"math/rand"
	"sync"
	"time"
)

// job ...
type job struct {
	value int64
}

// result ...
type result struct {
	job *job
	sum int64
}

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

//shuiJiShuChan 1.开启一个goroutine循环生成int64类型的随机数,发送到jobChan
func shuiJiShuChan(a chan<- *job) {
	defer wg.Done()
	//生成int64类型的随机数,发送到jobChan
	for {
		x := rand.Int63()
		new1 := &job{
			value: x,
		}
		a <- new1
		time.Sleep(time.Millisecond * 1000)
	}
}

// jieJue 从通道ch1读取数据,然后计算各个位数之和存入ch2中
func jieJue(ch1 <-chan *job, resultChan chan<- *result) {
	defer wg.Done()
	// 从jobChan中读取数据,然后计算各个位数之和存入resultChan中
	for {
		job := <-ch1
		sum := int64(0)
		n := job.value
		for n > 0 {
			sum += n % 10
			n = n / 10
		}
		newResult := &result{
			job: job,
			sum: sum,
		}
		resultChan <- newResult
	}
}

//使用goroutine和channel实现一个计算int64随机数各位数和的程序。
func main() {
	wg.Add(1)
	//1.开启一个goroutine循环生成int64类型的随机数,发送到jobChan
	go shuiJiShuChan(jobChan)
	//2.开启24个goroutine从jobChan中取出随机数计算各位数的和,将结果发送到resultChan
	wg.Add(24)
	for i := 0; i < 24; i++ {
		go jieJue(jobChan, resultChan)
	}
	//3.主goroutine从resultChan取出结果并打印到终端输出
	for result := range resultChan {
		fmt.Println(result.job.value, result.sum)
	}
	wg.Wait()
}

Golang中的并发编程使用goroutinechannel实现Goroutine是一种轻量级的线程,可以在同一进程内并发地运行多个任务,而不会造成线程上下文切换的开销。Channel是一种特殊的据类型,用于在不同的goroutine之间传递据。 使用goroutine非常简单,只需要在函调用前加上关键字go即可启动一个goroutine。例如: ``` func main() { go func() { // 这里是一个新的goroutine }() // 这里是主goroutine } ``` 使用channel也很简单,可以使用make函创建一个channel,然后使用<-操作符发送或接收据。例如: ``` ch := make(chan int) go func() { ch <- 42 // 发送据 }() x := <-ch // 接收据 ``` 在Golang中,channel的发送和接收操作是阻塞的。当发送者向一个已满的channel发送据时,发送操作会被阻塞,直到有接收者从该channel中接收据。同样地,当接收者从一个空的channel中接收据时,接收操作也会被阻塞,直到有发送者向该channel中发送据。 除了基本的发送和接收操作外,channel还支持以下操作: - 关闭通道:使用close函关闭通道。关闭通道后,无法再发送据,但可以继续接收据。 - 判断通道是否已关闭:使用_, ok := <-ch语句判断通道是否已关闭。 - 使用带缓冲的通道:使用make函创建一个带缓冲的通道,例如ch := make(chan int, 10)。带缓冲的通道可以存储一定量的据,当缓冲区已满时,发送操作会阻塞,直到有接收者从该通道中接收据。 通过goroutinechannel的组合,Golang实现了高效的并发编程,这也是Golang的一大特色。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值