Solution: Goroutines

Let's look at the solution.

We'll cover the following...

Solution

Press + to interact
package main
import (
"fmt"
"math"
"sync"
)
var (
mu sync.Mutex
)
func isPrime(num int) bool {
for i := 2; i <= int(math.Sqrt(float64(num))); i++ {
if int(num)%i == 0 {
return false
}
}
return true
}
func findPrimes(resultMap map[int]struct{}, startFrom, tryCount int, wg *sync.WaitGroup) {
for i := startFrom; i < startFrom+tryCount; i++ {
if isPrime(i) {
mu.Lock()
resultMap[i] = struct{}{}
mu.Unlock()
}
}
wg.Done()
}
func main() {
resultMap := make(map[int]struct{})
var wg sync.WaitGroup
for i := 0; i < 100; i++ {
wg.Add(1)
go findPrimes(resultMap, 99999*i+2, 1000, &wg)
}
wg.Wait()
fmt.Printf("Found %v primes\n", len(resultMap))
if len(resultMap) < 6746 {
panic("did not find all the prime numbers")
}
}

Explanation

Goroutines running in the background don’t stop the program from terminating. In ...