少說話多寫程式碼之GO開發——008:go通道
通道(channel)是可以傳遞資料的一個數據結構。
用操作符<-
指定通道的方向,傳送或接收。如果未指定方向,則為雙向通道。
比如,
Chanel <- data// 把 data 傳送到通道 Chanel value := <-chanel// 從 Chanel 接收資料賦值給value
通道可以給兩個 goroutine 之間傳遞一個指定型別的值來同步執行和通訊。以如下程式碼為例,
新建檔案grammar4_channel.go,
grammar4_channel.go
package basicGrammar import "fmt" //將通道來的陣列元素挨個連線 func connectContent(str [] string,channel chan string){ content := "" for _,v:=range str{ content += v } channel<- content } func TestChannel(){ //陣列 str:=[]string{"天","地","雨","風","大陸","長空"} //定義一個通道 channel := make(chan string) //呼叫通道 go connectContent(str[:2],channel) go connectContent(str[2:4],channel) go connectContent(str[4:],channel) //顯示結果 x,y,z:= <-channel,<-channel,<-channel fmt.Println(x,y,z) //此處關閉通道,後面就沒有結果打印出來了 close(channel) go connectContent(str[:2],channel) v:= <-channel fmt.Println(v) }
這段程式碼是通過協程將string陣列的元素組合,完成後將組合的值返回並列印。通道的產生是make函式,關閉使用close函式。
上面程式碼執行結果如下,
大陸長空 天地 雨風
如果將close函式註釋掉,則結果是這樣
大陸長空 天地 雨風 天地
通道也可以設定緩衝,也是在make時指定緩衝,比如格式如下,
ch := make(chan int, 300)
由於緩衝區的大小是有限的,所以還是必須有接收端來接收資料的,否則緩衝區一滿,資料傳送端就無法再發送資料了。
另外通道的關閉是這樣的,通道接收不到資料後 ,或者本次傳送的資料全部收到後,這時通道就可以使用 close() 函式來關閉。如果不關閉接收方在有值可以接收之前會一直阻塞。
程式碼下載(包含前面全部測試程式碼):https://download.csdn.net/upload/10990662