1.channel的讀取與聲明3d
//goroutine之間利用channel進行通訊 package main import ( "fmt" "time" ) func readChan (c chan int) { //讀取通道中的內容 a := <- c fmt.Println(a) } func readChan2 (c chan int) { //讀取通道中的內容 a := <- c fmt.Println(a) } func main () { var intChan chan int intChan = make(chan int, 3) intChan <- 3 intChan <- 2 intChan <- 1 //通道和隊列同樣,先進先出 go readChan(intChan) //3 go readChan2(intChan) //2 time.Sleep(time.Second * 10) }
channel 和隊列是同樣,先進先出的。blog
2. 帶緩衝區的通道聲明與通道阻塞隊列
//通道阻塞 package main import ( "fmt" "time" ) func write (c chan int) { for i := 0; i < 100; i++ { c <- i fmt.Printf("put data %d\n", i) } } func read (c chan int) { for i := 0; i < 100; i++ { a := <- c fmt.Println(a) time.Sleep(time.Second) } } func main () { //帶緩衝區的通道,這個緩衝區的大小爲10 chan01 := make(chan int, 10) //只寫不讀在通道達到長度10後,通道滿了,會發送阻塞,不能在繼續寫入數據了 go write(chan01) go read(chan01) time.Sleep(10 * time.Second) }
輸出結果爲it
3. 關閉通道 close(channel)class
package main import ( "fmt" ) func main () { chan01 := make(chan int, 10) for i := 0; i < 10; i++ { chan01 <- i } //close 關閉通道 close(chan01) //這麼寫會不停輸出,由於讀取10條後,chan01已經關閉 // for { // b := <- chan01 // fmt.Println(b) // } //1.使用ok來判斷 // for { // b, ok := <- chan01 // if ok == false { // fmt.Println("chan is close") // break // } // fmt.Println(b) // } //2使用for range 遍歷 for v := range chan01 { fmt.Println(v) } }
關閉通道後,判斷有兩種方法1.參數ok來判斷;2 for ...range 判斷,通道關閉後會自動退出。import
4. channel select 的應用select
//channel select 操做 package main import ( "fmt" "time" ) func main () { chan01 := make(chan int, 10) chan02 := make(chan int, 10) for i := 0; i < 10; i++ { chan01 <- i chan02 <- i*i } for { select { case v := <- chan01: fmt.Println(v) case v := <- chan02: fmt.Println(v) default: fmt.Println("time out") time.Sleep(time.Second) } } }