Go語言帶緩衝的通道實現

2022-09-21 17:06:11 字數 900 閱讀 4975

go語言中有緩衝的通道(buffered channel)是一種在被接收前能儲存乙個或者多個值的通道。這種型別的通道並不強制要求 goroutine 之間必須同時完成傳送和接收。通道會阻塞傳送和接收動作的條件也會不同。只有在通道中沒有要接收的值時,接收動作才會阻塞。只有在通道沒有可用緩衝區容納被傳送的值時,傳送動作才會阻塞。

這導致有緩衝的通道和無緩衝的通道之間的乙個很大的不同:無緩衝的通道保證進行傳送和接收的 goroutine 會在同一時間進行資料交換;有緩衝的通道沒有這種保證。

在無緩衝通道的基礎上,為通道增加乙個有限大小的儲存空間形成帶緩衝通道。帶緩衝通道在傳送時無需等待接收方接收即可完成傳送過程,並且不會發生阻塞,只有當儲存空間滿時才會發生阻塞。同理,如果緩衝通道中有資料,接收時將不會發生阻塞,直到通道中沒有資料可讀時,通道將會再度阻塞。

無緩衝通道保證收發過程同步。無緩衝收發過程類似於快遞員給你**讓你下樓取快遞,整個遞交快遞的過程是同步發生的,你和快遞員不見不散。但這樣做快遞員就必須等待所有人下樓完成操作後才能完成所有投遞工作。如果快遞員將快遞放入快遞櫃中,並通知使用者來取,快遞員和使用者就成了非同步收發過程,效率可以有明顯的提公升。帶緩衝的通道就是這樣的乙個「快遞櫃」。

如何建立帶緩衝的通道呢?參見如下**:

通道例項 := make(chan 通道型別, 緩衝大小)

下面通過乙個例子中來理解帶緩衝通道的用法,參見下面的**:

package main

import "fmt"

func main() {

// 建立乙個3個元素緩衝大小的整型通道

ch := make(chan int, 3)

// 檢視當前通道的大小

fmt.println(len(ch))

// 傳送3個整型元素到通道

ch**輸出如下:03

**說明如下:

go語言通道插入0 Go語言帶緩衝的通道

go語言中有緩衝的通道 bufferedchannel 是一種在被接收前能儲存乙個或者多個值的通道。這種型別的通道並不強制要求goroutine之間必須同時完成傳送和接收。通道會阻塞傳送和接收動作的條件也會不同。只有在通道中沒有要接收的值時,接收動作才會阻塞。只有在通道沒有可用緩衝區容納被傳送的值時...

29《Go語言入門》帶緩衝通道

這是我純手寫的 go語言入門 手把手教你入門go。原始碼 文章,看了你就會?文章中所有的 我都放到了github.com ganzhixiong go learning這個倉庫中!看文章時,對照倉庫中 學習效果更佳哦!建立帶緩衝通道 支援?帶緩衝通道 buffered channel 是一種在被接收...

Go 緩衝通道

語法結構 cap為容量 ch make chan type,cap 通道是非同步的,是一種在被建立時就被開闢了能儲存乙個或者多個值的通道。這種型別並不要求傳送與接收同時進行。只要緩衝區有未使用空間用於傳送資料,或還包含可以接收的資料,那麼其通訊就會無阻塞地進行。只有在通道中沒有要接收的值時,接收動作...