判断 1 ~ 30万之间所有的素数, 将素数记录到切片
package main
import "time"
// 判断某个数是否为素数
func findPrimeNumber(num int) bool {
if num < 2 {
return false
}
var isPrime bool = true
for i := 2; i < num; i++ {
if num%i == 0 {
return false
}
}
return isPrime
}
func main() {
// 记录起始时间
start := time.Now().Unix()
var resArr = []int{}
for i := 2; i <= 300000; i++ {
res := findPrimeNumber(i)
if res {
resArr = append(resArr, i)
}
}
// 记录结束时间
end := time.Now().Unix()
println(len(resArr), end-start)
}
//运行结果 : 数据总数 25997 耗时 29 秒
package main
import (
"sync"
"time"
)
var wg sync.WaitGroup
var resArr []int
// 判断某个数是否为素数
func findPrimeNumber(num int) bool {
if num < 2 {
return false
}
var isPrime bool = true
for i := 2; i < num; i++ {
if num%i == 0 {
return false
}
}
return isPrime
}
func findPrimeNumbers(startNum int) {
for i := startNum * 30000; i <= 30000+startNum*30000; i++ {
res := findPrimeNumber(i)
if res {
resArr = append(resArr, i)
}
}
wg.Done()
}
func main() {
// 记录起始时间
start := time.Now().Unix()
// 并发执行
for i := 0; i < 10; i++ {
wg.Add(1)
go findPrimeNumbers(i)
}
wg.Wait()
// 记录结束时间
end := time.Now().Unix()
println(len(resArr), end-start)
}
//运行结果 : 数据总数 25993 耗时 9 秒
开启协程后程序执行时间明显缩短, 但存在一个数据记录丢失的问题( 通过并发/并行 变量的值产生了写入冲突问题 ), 请观看下一节, 我们将利用管道来解决数据记录问题.