何時關閉通道:
第一,只有在後面要檢查通道是否關閉的時候才需要顯式地關閉通道;
第二,應該由傳送端的goroutine關閉通道,而不是由接收端的goroutine來完成;
第三,如果通道並不需要檢查是否被關閉,那麼不關閉這些通道並沒有什麼問題,因為通道非常輕量,因此它不會像開啟檔案不關閉那樣耗盡系統資源。
兩個陷阱:
1、程式完成時我們沒得到任何結果
因為主gorouting退出後,其他的工作goroutine也會退出,所以必須保證所有工作goroutine都完成後才讓主goroutine退出。
2、死鎖
有兩種情況下可能發生死鎖:
第一種是即使所有的工作都已經完成了,但是主goroutine和工作goroutine還存活,這種情況通常是由於工作完成了但是主goroutine無法獲得工作goroutine的完成狀態。
第二種是當兩個不同的goroutine都鎖定了受保護的資源而且同時嘗試去獲得對方資源的時候,一般在使用鎖的時候才會出現。
Go語言最佳實踐 異常和錯誤
go語言將錯誤和異常兩者區分對待。1 go語言中處理錯誤的慣用法是將錯誤以函式或者方法最後乙個返回值的形式將其返回,並總是在呼叫它的地方檢查返回的錯誤值。2 對於 不可能發生的事情 稱為異常,可使用panic 函式向呼叫棧傳播異常。何時使用recover 捕捉異常,何時讓panic 繼續傳播呢?2....
go 通道 go語言通道channel
通過使用通道,在多個goroutine傳送和接受共享的資料,達到資料同步的目的。通道,他有點像在兩個routine之間架設的管道,乙個goroutine可以往這個管道裡塞資料,另外乙個可以從這個管道裡取資料,有點類似於我們說的佇列。宣告乙個通道很簡單,我們使用chan關鍵字即可,除此之外,還要指定通...
Go語言併發列印(借助通道實現)
之前的例子建立的都是無緩衝通道。使用無緩衝通道往裡面裝資料時,裝入方將被阻塞,直到另外通道在另乙個goroutine中被取出,同時,如果通道中沒有放入任何資料,接收方試圖從通道中獲取資料時,同樣也是阻塞。傳送和接收的操作是同步完成的。下面介紹乙個併發列印的例子,將goroutine和channel放...