一段代码理解golang协程和通道
这段代码的目的是算出100以内所有的质数,当然你可以从命令行输入你想要验证的最大数字。
理解了递归,协程,通道就能读懂这段代码。反过来读懂了这段代码,也就理解了递归,协程和通道。
令人汗颜的是,由于刚开始不太熟悉golang的协程和通道机制,看懂这段代码花了十几分钟… 看懂了之后感觉非常好。希望你也可以。
package main
import (
"flag"
"fmt"
"os"
"strconv"
)
type T struct {
A int
B string
}
var goal int
var mark int
func primetask(c chan int) {
p := <-c
mark++
if p > goal {
os.Exit(0)
}
fmt.Println()
nc := make(chan int)
go primetask(nc)
for {
i := <-c
fmt.Println("mark=", mark, "i=", i, "p=", p)
if i%p != 0 {
nc <- i
}
}
}
func main() {
flag.Parse()
args := flag.Args()
if args != nil && len(args) > 0 {
var err error
goal, err = strconv.Atoi(args[0])
if err != nil {
goal = 100
}
} else {
goal = 100
}
fmt.Println("goal =", goal)
c := make(chan int)
go primetask(c)
for i := 2; ; i++ {
c <- i
}
}