天天看點

go語言基礎 通道 channel

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。。。。")
}