1.通道的概念:
Channel,通道,專門用于goroutine之間傳遞消息
也是一種引用類型的資料:可以作為參數,也可以作為傳回值
文法:
1.建立:make(chan T)
2.使用:
發送資料:寫
chan <- data
接收資料:讀
data := <- chan
通道的阻塞:
不帶緩存:發送和接收都是阻塞的。
發送是阻塞的,直到有另一個goroutine讀取資料解除阻塞。
類似的,接收也是阻塞的,直到另一個goroutine寫出資料解除阻塞
2.關閉通道:發送方關閉通道,用于通知接收方已經沒有資料了。
close(chan),
v,ok <- chan
關閉通道後,其他的goroutine通路通道擷取資料時候,得到是零值和false
A:死循環,可以有結束的條件。
for{
v ,ok := <- chan
if ok== false{
//通道已經關閉。。
break
}
}
B:for range chan
循環從通道中擷取資料,直到通道關閉。
for v := range chan{
....v
}
package main
import "fmt"
func main() {
/*
Channel,通道,
1.用于goroutine,傳遞消息的。
2.通道,每個都有相關聯的資料類型,
nil chan,不能使用,類似于nil map,不能直接存儲鍵值對
3.使用通道傳遞資料:<-
chan <- data,發送資料到通道。向通道中寫資料
data <- chan,從通道中擷取資料。從通道中讀資料
4.阻塞:
發送資料:chan <- data,阻塞的,直到另一條goroutine,讀取資料來解除阻塞
讀取資料:data <- chan,也是阻塞的。直到另一條goroutine,寫出資料解除阻塞。
5.本身channel就是同步的,意味着同一時間,隻能有一條goroutine來操作。
*/
var ch1 chan bool //聲明,沒有建立
fmt.Println(ch1) //<nil>
fmt.Printf("%T\n", ch1) //chan bool
ch1 = make(chan bool) //0xc042036060,是引用類型的資料
fmt.Println(ch1)
go func() {
for i:=0; i<10; i++ {
fmt.Println("子goroutine中,i:",i)
}
// 循環結束後,向通道中寫資料,表示要結束了。。
ch1 <- true
fmt.Println("結束。。")
}()
data:=<- ch1 // 從ch1通道中讀取資料
fmt.Println("data-->", data)
fmt.Println("main。。over。。。。")
}