```
package main
import (
"fmt"
"time"
)
func putNum(intChan chan int) {
for i := 1; i <= 8000; i++ {
? ? ? ? intChan <- i
? ? }
close(intChan)
}
func primeNum(intChan chan int, primeChan chan int, exitChan chan bool) {
for {
? ? ? ? time.Sleep(time.Millisecond) //由于輸出流的問題,不加sleep有可能導致退出提前輸出,實際執行順序是對的
num, ok := <-intChan
if !ok {
break //取不到了
? ? ? ? }
flag := true
//判斷num是否為素數
for i := 2; i < num; i++ {
if num%i == 0 {
//num不是素數
flag = false
break
}
}
if flag {
primeChan <- num
}
}
? ? fmt.Println("有一個primeNum協程因為取不到數據,退出")
//向exitchan寫入退出標識
exitChan <- true
}
func main() {
intChan := make(chan int, 10)
for i := 0; i < 10; i++ {
? ? ? ? intChan <- i
}
stringChan := make(chan string, 5)
for i := 0; i < 5; i++ {
stringChan <- "hello" + fmt.Sprintf("%d", i)
}
//傳統的方式在遍歷管道時,如果不關閉會阻塞而導致deadlock
//問題:在實際開發中,無法確定什么時候關閉該管道
//可以使用select方式解決
for {
select {
//如果intChan一直沒有關閉,不會一直阻塞而導致deadlock
//會自動到下一個case匹配
case v := <-intChan:
? ? ? ? ? ? fmt.Printf("從intchan讀取的數據%d\\n", v)
? ? ? ? ? ? time.Sleep(time.Second)
case v := <-stringChan:
fmt.Printf("從stringChan讀取的數據%s\\n", v)
? ? ? ? ? ? time.Sleep(time.Second)
default:
fmt.Printf("都取不到\\n")
time.Sleep(time.Second)
break //無法退出for循環,解決方法如下
//return(方法一)
//label goto(方法二)
}
? ? }
}
```
- 數據類型
- 數組array
- 切片slice
- 字符串string
- map
- 結構體struct
- 方法func
- 匿名結構體(繼承)
- 字段別名
- 接口interface
- 常量
- 基礎語法
- 循環for
- 遍歷
- 函數func
- defer
- 異常處理error
- 訪問范圍
- 包
- 類型斷言
- 文件
- 打開文件
- 讀取文件
- 寫文件
- 判斷是否存在
- 拷貝文件
- JSON
- 序列化
- 反序列化
- 命令行
- 雜項
- Windows下配置加速
- 相關鏈接
- 占位符
- 隨機數rand
- 單元測試
- goroutine
- 并發和并行
- 協程和主線程
- MPG模式
- 設置CPU數量
- 全局互斥鎖
- 管道
- 示例1
- 示例2
- select
- 異常捕獲
- 反射
- 示例
- 示例-改變值
- 網絡編程
- TCP編程
- 示例一
- redis