package main
import (
"fmt"
"time"
)
func main() {
//使用select可以解決從管道取數據的阻塞問題
//1.定義一個管道 10個數據int
intChan := make(chan int, 10)
for i := 0; i < 10; i++ {
intChan<- i
}
//2.定義一個管道 5個數據string
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)
return
}
}
}