主进程退出后协程也会跟着主进程一起退出,无论主进程时候退出。

package main

import (
    "fmt"
    "time"
)

func test() {
    for i := 0; i < 20; i++ {
        fmt.Println("test() hello", i)
        time.Sleep(time.Millisecond * 100)
    }
}

func main() {
    go test()
    fmt.Println("-------------")
    for i := 0; i < 20; i++ {
        fmt.Println("main() hello", i)
        time.Sleep(time.Millisecond * 50)
    }
}

使用sync.WaitGroup可以让主进程等待协程执行完成再退出:

package main

import (
    "fmt"
    "sync"
    "time"
)

var wg sync.WaitGroup

func test() {
    for i := 0; i < 20; i++ {
        fmt.Println("test() hello", i)
        time.Sleep(time.Millisecond * 100)
    }
    wg.Done() // 协程计数器 -1
    fmt.Println("协程退出")
}

func main() {
    wg.Add(1) // 协程计数器 +1
    go test()
    fmt.Println("-------------")
    for i := 0; i < 20; i++ {
        fmt.Println("main() hello", i)
        time.Sleep(time.Millisecond * 50)
    }
    wg.Wait()
    fmt.Println("主线程退出")
}

统计素数:

package main

import (
    "fmt"
    "sync"
    "time"
)

var wg sync.WaitGroup

func test(n int) {
    for num := (n-1)*30000 + 1; num < n*30000; num++ {
        if num > 1 {
            var flag = true
            for i := 2; i < num; i++ {
                if num%i == 0 {
                    flag = false
                    break
                }
            }
            if flag {
                fmt.Println(num, "是素数")
            }
        }
    }
    wg.Done() // 减一
}

func main() {
    start := time.Now().Unix()
    for i := 0; i < 4; i++ {
        wg.Add(1) // 加一
        go test(i)
    }
    wg.Wait()
    end := time.Now().Unix()
    fmt.Println(end - start)
}