Channel是Go中的一個核心類型,你可以把它看成一個管道,通過它並發核心單元就可以發送或者接收數據進行通訊。
它的操作符是箭頭 <- 。
ch <- v // 發送值v到Channel ch中 v := <-ch // 從Channel ch中接收數據,並將數據賦值給v
(箭頭的指向就是數據的流向)
就像 map 和 slice 數據類型一樣, channel必須先創建再使用:
ch := make(chan int) ch := make(chan int)
Channel類型
Channel類型的定義格式如下:
[plain] view plain copy print?
ChannelType = ( "chan" | "chan" "<-" | "<-" "chan" ) ElementType .
ChannelType = ( "chan" | "chan" "<-" | "<-" "chan" ) ElementType .
它包括三種類型的定義。可選的<-代表channel的方向。如果沒有指定方向,那么Channel就是雙向的,既可以接收數據,也可以發送數據。
chan T // 可以接收和發送類型為 T 的數據 chan<- float64 // 只可以用來發送 float64 類型的數據 <-chan int // 只可以用來接收 int 類型的數據
<-總是優先和最左邊的類型結合。(The <- operator associates with the leftmost chan possible)
chan<- chan int // 等價 chan<- (chan int) chan<- <-chan int // 等價 chan<- (<-chan int) <-chan <-chan int // 等價 <-chan (<-chan int) chan (<-chan int)
使用make初始化Channel,並且可以設置容量:
make(chan int, 100) make(chan int, 100)
容量(capacity)代表Channel容納的最多的元素的數量,代表Channel的緩存的大小。
如果沒有設置容量,或者容量設置為0, 說明Channel沒有緩存,只有sender和receiver都准備好了后它們的通訊(communication)才會發生(Blocking)。
如果設置了緩存,就有可能不發生阻塞, 只有buffer滿了后 send才會阻塞, 而只有緩存空了后receive才會阻塞。一個nil channel不會通信。
可以通過內建的close方法可以關閉Channel。
你可以在多個goroutine從/往 一個channel 中 receive/send 數據, 不必考慮額外的同步措施。
Channel可以作為一個先入先出(FIFO)的隊列,接收的數據和發送的數據的順序是一致的。
channel的 receive支持 multi-valued assignment,如
v, ok := <-ch
v, ok := <-ch
它可以用來檢查Channel是否已經被關閉了。