go語言 channel的乙個「奇怪」特性

2021-06-28 22:23:23 字數 886 閱讀 5446

**自go技術晨讀)

go語言的channel有乙個看上去很奇怪的特性,就是如果向乙個為空值(nil)的channel寫入或者讀取資料,當前goroutine將永遠阻塞。

以上四個main函式都會永遠阻塞(但是因為沒有其他goroutine,所以runtime會報告乙個deadlock錯誤)

為什麼go team 要這麼設計呢?

據說是為了實現乙個叫「guarded selective wating」的模式,及條件等待:在select中的一些case中如果對應的條件不滿足就不在這個case上等待。

有這樣乙個場景:

利用nil channel特性,可以非常優雅的實現:

以上是利用nil channel實現的永久阻塞。

——-———————————  華麗分割線  ——————————————

如果我們建立乙個channel,但是不向它寫資料也不關閉,只是讀資料,也可以實現永久阻塞的效果。效果如下:

這就意味著,對於實現「guarded selective wating」模式來說,nil channel的永久阻塞特性並不是必須的,但是nil channel顯然更方便,也不需要浪費額外的資源去建立乙個用來永久阻塞的channel。

Go語言裡channel的死鎖

最近看了下go語言並寫了些示例 在用到channel的時候報了個奇怪的錯誤然後退出 fatal error all goroutines are asleep deadlock 在stackoverflow上搜到 查了查,出錯的 如下 func chanfunc c chan int,d chan ...

Go語言的管道Channel用法

channel 是有型別的管道,可以用 channel 操作符 ch v 箭頭 就是資料流的方向。和 map 與 slice 一樣,channel 使用前必須建立 ch make chan int 預設情況下,在另一端準備好之前,傳送和接收都會阻塞。這使得 goroutine 可以在沒有明確的鎖或競...

Go語言的Channel遍歷方法詳解

channel是go語言中的乙個核心型別,可以把它看成管道。併發核心單元通過它就可以傳送或者接收資料進行通訊,這在一定程度上又進一步降低了程式設計的難度。channel是乙個資料型別,主要用來解決go程的同步問題以及協程之間資料共享資料傳遞 的問題。1 channle 本質上是乙個資料結構 佇列 資...