Go: channel
channel不能使用for循环动态遍历
package main import ( "fmt" ) func main() { intChan := make(chan int, 10) for b := 0; b < cap(intChan); b++ { intChan <- b + 100 } fmt.Println("len(intChan) =", len(intChan)) for i := 0; i < len(intChan); i++ { fmt.Printf("before fetch i = %v, len(intChan) = %v\n", i, len(intChan)) println(<-intChan) fmt.Printf("after fetch i = %v, len(intChan) = %v\n", i, len(intChan)) fmt.Println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~") } }
package main import ( "bytes" "fmt" "runtime" "strconv" "time" ) func GetGoroutineId() (n uint64) { vail := make([]byte, 1024) vail = vail[:runtime.Stack(vail, true)] // fmt.Println(string(vail)) vail = bytes.TrimPrefix(vail, []byte("goroutine ")) vail = vail[:bytes.IndexByte(vail, ' ')] n, err := strconv.ParseUint(string(vail), 10, 64) if err != nil { return 0 } return } func generate(c chan int, n int) { for i := 1; i <= n; i++ { c <- i } close(c) } func worker(intChan chan int, exitChan chan bool, primeChan chan int) { var flag bool for { number, ok := <-intChan if !ok { break } flag = true for i := 2; i < number; i++ { if number%i == 0 { flag = false break } } if flag { primeChan <- number } } fmt.Printf("Goroutine(%v) exit intChan empty\n", strconv.Itoa(int(GetGoroutineId()))) exitChan <- true } func main() { intChan := make(chan int, 1000) primeChan := make(chan int, 20000) exitChan := make(chan bool, 4) var ( numbers int = 222222222 workerNumber int = 1 primeCount int commence = time.Now().Unix() closure int64 ) go generate(intChan, numbers) for i := 0; i < workerNumber; i++ { go worker(intChan, exitChan, primeChan) } go func() { for i := 0; i < workerNumber; i++ { <-exitChan } fmt.Printf("Goroutine(%v) all worker goroutine exit\n", strconv.FormatUint(GetGoroutineId(), 10)) closure = time.Now().Unix() close(primeChan) close(exitChan) }() // println(len(primeChan)) for { _, ok := <-primeChan if !ok { break } // fmt.Printf("prime: %v\n", prime) primeCount++ } elapsed := closure - commence fmt.Println("elapsed:", elapsed) println(primeCount) fmt.Printf("Goroutine(%v) main exixt", strconv.FormatUint(GetGoroutineId(), 10)) }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律