1. 程式人生 > 其它 >Go- Buffer Channel- Select-基礎理解

Go- Buffer Channel- Select-基礎理解

這篇主要講Select這個有用的關鍵字用來監聽管道順帶講下帶緩衝的Channel

帶緩衝的Channel

Channel是可以帶有緩衝的 c := make(chan int,3) 這麼宣告則代表這個管道里最多同時可以放三個int型別的資料

如下程式碼所示

package main

func main() {
	c := make(chan int,3)
	c <- 1
	c <- 1
	c <- 1
<span style="white-space:pre">	</span>//c <- 1 如果再加上這一句則會報錯 因為無法同時放入四個int型別資料
	<- c
	<- c
	<- c
}

Select

Go提供了select關鍵字用於監聽各個通道

比如我要取通道1中的資料並且是一有資料我就取出來 那我們該如何實現呢

這是就可以藉助select 用來監聽一旦有資料進來select自動幫你取資料出來 還是挺方便的一個功能

package main

import (
	"time"
	"fmt"
)

func main() {
	o := make(chan int)
	c := make(chan int)

	go func() {
		for {
			select {
			case a := <- c://監聽c管道只要一有資料進來 就打印出來
				fmt.Println(a)
			//這裡After返回 <-chan Time 也就是監聽 <-chan Time這個管道
			//如果超過5秒鐘 如果select一直未收到訊息 那麼 就會給<-chan Time通道傳送一個訊息
			//每隔5秒就會發送一次
			case <- time.After(5 * time.Second):
				o <- 0
				break //僅僅是跳出select迴圈並未跳出for迴圈
			}
		}
	} ()
	for i := 0; i<100 ; i++{
		c <- i
	}
	<- o //接收訊息
}