Go——Go語言 Channel <- 箭頭操作符


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是否已經被關閉了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM