Golang 使用并发计算给定数字以内的所有质数
在这篇Go语言文章中,我们将编写程序来使用并发执行计算给定数字以内的所有质数。并发执行是同时执行多个任务的过程。在Golang中,使用go程和通道来创建并发程序。
Go程是由Go运行时管理的轻量级线程,而通道则有助于在Go程之间进行无冲突的通信。
语法
func make ([] type, size, capacity)
make 函数在Go语言中用来创建一个数组/映射。它接收要创建的变量的类型、大小和容量作为参数。
func range(variable)
range函数用于迭代任何数据类型。要使用它,我们首先需要编写range关键字,后跟我们想要迭代的数据类型,结果是循环将迭代到变量的最后一个元素。
步骤
- 在程序中导入main、fmt和sync包
-
创建一个主函数
-
在主函数中设置范围,限制素数计算的上限值
-
然后,使用make函数创建一个名为primes的通道,用于获取素数
-
在这一步中,创建一个Wait Group wg,以便在退出主函数之前所有的go routine都完成
-
然后,通过调用generatePrimes函数来启动go routine
-
在这里,将限制、primes通道和wg作为参数传递
-
启动另一个go routine来打印素数,通过调用printPrimes函数
-
在这里,将primes通道和Wait Group作为参数传递
-
然后,使用wait函数等待所有的go routine完成
-
在这一步中,创建一个generatePrimes函数来生成给定限制范围内的素数
-
在这个函数中,将初始素数2和3发送到primes通道。然后,在步长为2的情况下,从5迭代到限制范围
-
在每次迭代中,通过从3迭代到该数字的平方根来检查质数性
-
如果数字能被其中任何一个除数整除,则它不是一个质数,Prime设置为false。否则,它仍为true
-
如果数字是质数,则将其发送到primes通道
-
创建printPrimes函数来接收primes通道中的质数并打印它们
-
一旦打印完所有数字,调用wg.Done()来通知Wait Group已经完成打印
-
在所有go routine完成后,程序结束
示例
在这个示例中,我们将编写一个Go程序,使用go routine和channel计算所有素数,以实现并发执行。
package main
import (
"fmt"
"sync"
)
func main() {
limit := 100
primes := make(chan int)
var wg sync.WaitGroup
wg.Add(1)
go generatePrimes(limit, primes, &wg)
wg.Add(1)
go printPrimes(primes, &wg)
wg.Wait()
}
func generatePrimes(limit int, primes chan<- int, wg *sync.WaitGroup) {
defer close(primes)
defer wg.Done()
primes <- 2
primes <- 3
for num := 5; num <= limit; num += 2 {
isPrime := true
for i := 3; i*i <= num; i += 2 {
if num%i == 0 {
isPrime = false
break
}
}
if isPrime {
primes <- num
}
}
}
func printPrimes(primes <-chan int, wg *sync.WaitGroup) {
defer wg.Done()
fmt.Println("The prime numbers till the rage of 100 are:")
for prime := range primes {
fmt.Println(prime)
}
}
输出
The prime numbers till the rage of 100 are:
2
3
5
7
11
13
17
19
23
29
31
37
41
43
47
53
59
61
67
71
73
79
83
89
97
结论
我们利用一个示例编写并执行了计算小于给定数字的质数程序,使用了Go语言的Go routines和channels来实现并发。