語法結構:cap為容量
ch := make(chan type, cap)
通道是非同步的,是一種在被建立時就被開闢了能儲存乙個或者多個值的通道。
這種型別並不要求傳送與接收同時進行。只要緩衝區有未使用空間用於傳送資料,或還包含可以接收的資料,那麼其通訊就會無阻塞地進行。只有在通道中沒有要接收的值時,接收動作才會阻塞。
示例一
package mainimport (
"fmt"
)func main()
示例二
package mainimport (
"fmt"
"time"
)func write(ch chan int)
close(ch)
}func main()
}
建立乙個兩個容量的通道。
write協程先向通道裡寫入兩個資料,然後阻塞,並列印,主協程睡眠兩秒。
兩秒後,主協程從通道中讀取乙個資料,並睡眠兩秒,此時write協程繼續向通道裡寫入乙個資料,然後阻塞,等待主協程兩秒後讀取資料。
package mainimport (
"fmt"
)func main()
當我們向通道寫入資料時,超出了通道的容量,因此寫入發生了阻塞。現在想要寫操作能夠進行下去,必須要有其它協程來讀取這個通道的資料。
但在程式中,並沒有併發協程來讀取這個通道,因此這裡會發生死鎖(deadlock)。
假設我們有 3 個併發執行的 go 協程(由go 主協程生成)。go 主協程需要等待這 3 個協程執行結束後,才會終止。這就可以用 waitgroup 來實現。
package mainimport (
"fmt"
"sync"
"time"
)func process(i int, wg *sync.waitgroup)
/* waitgroup用於等待一組執行緒的結束。
父執行緒呼叫add方法來設定應等待的執行緒的數量。
每個被等待的執行緒在結束時應呼叫done方法。
同時,主線程裡可以呼叫wait方法阻塞至所有執行緒結束。
*/func main()
//wait方法阻塞直到waitgroup計數器減為0。
wg.wait()
fmt.println("over")
}
Go無緩衝通道的陷阱
channel是go的特色之一,甚至說是最大的特色也不為過,使用起來也非常簡單。首先定義乙個int型別的channel ch1 make chan int 無緩衝通道 ch2 make chan int,10 帶緩衝的通道我們這裡主要關注無緩衝通道。來看看這段 package main import...
go語言通道插入0 Go語言帶緩衝的通道
go語言中有緩衝的通道 bufferedchannel 是一種在被接收前能儲存乙個或者多個值的通道。這種型別的通道並不強制要求goroutine之間必須同時完成傳送和接收。通道會阻塞傳送和接收動作的條件也會不同。只有在通道中沒有要接收的值時,接收動作才會阻塞。只有在通道沒有可用緩衝區容納被傳送的值時...
Go語言帶緩衝的通道實現
go語言中有緩衝的通道 buffered channel 是一種在被接收前能儲存乙個或者多個值的通道。這種型別的通道並不強制要求 goroutine 之間必須同時完成傳送和接收。通道會阻塞傳送和接收動作的條件也會不同。只有在通道中沒有要接收的值時,接收動作才會阻塞。只有在通道沒有可用緩衝區容納被傳送...