1.channel概念:緩存
相似管道pipe安全
先進先出測試
線程安全,多個goroutine同時訪問,不須要加鎖spa
channel是有類型的,整數類型的channel只能存放整數類型的數據線程
2.channel聲明 blog
var 變量名 chan 類型
var test chan int
var test chan string
var test chan map[string]string
var test chan stu
var test chan *stu ip
3.channel相似於map,slice必須進行初始化input
var test chan int權限控制
test = make(chan int,100) //在這裏若是容量爲0,會是什麼結果呢?string
4.channel接收數據和讀取數據
intchan <-10 //把數據發送到管道中
result := <- intchan //從channel中讀取數據,並賦值給result
接上面的疑問,若是容量爲0,會是什麼狀況呢?還有一些問題來一一驗證
沒有初始化的狀況:(報錯 nil chan)
import( "fmt" ) func main() { var c chan int c <- 10 result:= <- c fmt.Println(result) //goroutine 1 [chan send (nil chan)]: }
初始化後,容量 爲0:
import( "fmt" ) func main() { var c chan int c = make(chan int,0) c <- 10 result:= <- c fmt.Println(result) /* fatal error: all goroutines are asleep - deadlock! goroutine 1 [chan send]: main.main() c:/goclass/src/day8goroutine/channel/main.go:9 +0x60 exit status 2 */ }
仍是報錯,不太明顯,咱們換一種方法來測試:
import( "fmt" "time" ) func main() { var c chan int c = make(chan int,0) go func(){ //開啓一個goroutine fmt.Println("start input to the channel") c <- 10 fmt.Println("end input to the channel") }() time.Sleep(time.Second*100) result:= <- c fmt.Println(result) } //運行結果,會立馬輸出「start input to the channel」 這一行,而後等待100s後,會輸入result結果10。由於容量爲0的話,指的是channel沒有緩存容量 ,就是不可以緩存任何數據,若是容量改成1的話,會立馬輸出start和end兩句話。
5.channel 權限控制
var intchan chan <- int //intchan只可接收int類型數據
var intchan <- chan int //只能夠從intchan中讀取數據
var intchan chan int //便可以接收也可也讀取數據
package main import( "fmt" "sync" ) var waitgroup sync.WaitGroup func SendDate(c chan <- string){ //往chan中寫入數據,這個類型是隻寫的 c <- "beijing" c <- "shanghai" c <- "guangzhou" c <- "shenzhen" close(c) //寫完數據關閉channel waitgroup.Done() } func GetDate(c <- chan string){ //讀取chan中的數據,這個類型是隻讀的 for { input,ok :=<-c //檢查channel 是否關閉 if !ok{ fmt.Println("the chan is closed") break } fmt.Println(input) } waitgroup.Done() } func main() { c := make(chan string) waitgroup.Add(2) go SendDate(c) go GetDate(c) waitgroup.Wait() //等待全部的goroutine執行完成 }
上面的代碼中有權限的控制,goroutine和chan相結合。還有一個檢查chan是否關閉
input,ok := <-c
遍歷chan中的元素: