Go語言 chan的剖析

什麼是channel?

channel是goroutine之間互相通訊的工具。
具體點的說法,channel是一種通訊管道,可以把數據放入管道,也能從管道中讀出數據。一個goroutine把數據放入chan,而後另一個goroutine能夠從chan裏面讀出數據。數據結構

channel的使用

Go語言提供chan關鍵字來建立channel,一個channel只能傳遞一種數據結構,其餘類型的數據是不可使用該channel的。函數

package main

import "fmt"

func main(){
    var c chan int
    fmt.Println(c)
}

上面的代碼聲明瞭一個能夠傳遞int類型的channel變量c,可是最後會輸出nil,由於chan的初始值是nil。你不能夠對一個值爲nil的chan進行操做,你必須使用make關鍵字來建立可用的chan。工具

package main

import "fmt"

func main(){
    c := make(chan int)
    fmt.Printf("c 的類型是%T \n", c)
    fmt.Printf("c 的值是%v \n", c)
}

輸出結果以下:指針

c 的類型是 chan int
c 的值是   0xc42008060

咱們發現c的值彷佛是個地址。channel默認實際上是個指針
大部分狀況下,你只要把channel當作參數在一個goroutine裏傳遞給發送函數,另外一個goroutine也以直接從接收函數裏面把chan當作參數來使用。code

數據讀寫

go語言中使用<-來傳遞數據給channel.import

c <- 1

看起來像左箭頭,因此很好想象成是把右邊的東西送到左邊裏面去。變量

<- c

注意,這也是正確的語法,咱們從chan裏面讀取了數據,可是並無使用,不過使用下面這種寫法:語法

var data int 
data <- c

這樣子,從c裏面來的數據,就能存到data裏面去了。也能夠簡寫成下面這種形式channel

data := <- c

go語言會自動推導data的類型爲intim

請注意,上面的操做都會致使阻塞,當goroutine1把信息寫入channel中的時候,當沒有人讀取這個channel數據的時候,gouroutine1是會阻塞的,直到gouroutine2從channel裏讀出數據,gouroutine1纔會取消阻塞。同理:當goroutine1沒有寫入數據到chan的時候,goroutine2也是阻塞的。

未完待續

相關文章
相關標籤/搜索