Go語言的Channel遍歷方法詳解

2022-09-27 09:00:14 字數 1459 閱讀 5898

channel是go語言中的乙個核心型別,可以把它看成管道。併發核心單元通過它就可以傳送或者接收資料進行通訊,這在一定程度上又進一步降低了程式設計的難度。

channel是乙個資料型別,主要用來解決go程的同步問題以及協程之間資料共享資料傳遞)的問題。

(1)channle 本質上是乙個資料結構——(佇列),資料是先進先出。

(2)具有執行緒安全機制,多個go程訪問時,不需要枷鎖,也就是說channel本身是執行緒安全的。

(3)channel是有型別的,如乙個string型別的channel只能存放string型別資料。

channewww.cppcns.coml遍歷主要分為3種:

注:(1)寫入的次數與讀取的次數需要一致(本例是10);

(2)如果讀的次數多於寫的次數會發生:fatal error: all www.cppcns.comgoroutines are asleep - deadlock! ,若 在mm1中對ch8進行關閉(執行 close(ch8) ),多於的次數讀到的資料為0(資料預設值)。

(3)讀的次數少於寫的次數,會讀取出次數對應的內容,不會報錯。

if value, ok :=

1) 如果寫端沒有寫資料,也沒有關閉。

2)如果寫端寫資料, value 儲存

3)如果寫端關閉。 value 為資料型別預設值。ok 被設定為 false

var ch8 = make(chan int, 6)

func mm1()

close(ch8) }

func main()

var ch8 = make(chan int, 6)

func mm1() {

for i := 0; i < 10; i++ {

ch8注:寫完之後一定要關閉( 執行:close(ch8) ),否則會出現以下執行結果:

特別說明:以上例項都是子go程寫,主go程讀。如在子go程中寫,另乙個子go程中讀,不管哪種方法,都不會出現以上錯誤問題。(多次例項驗證)

var ch8 = make(chan int, 6)

func mm1() {

for i := 0; i < 10; i++ {

ch8通過以上驗證,為了保證程式的健壯性,在設計程式時,最好將channel的讀、寫分別在子go程中進行。寫完資料之後,記得關閉channel。

補充一點:

1、channel不像檔案一樣需要經常去關閉,只有當你確實沒有任何傳送資料了,或者你想顯式的結束range迴圈之類的,才去關閉channel;

2、關閉channel後,無法向channel 再傳送資料(引發 panic 錯誤後導致接收立即返回零值);

3、關閉channel後,可以繼續從channel接收資料;

4、對於nil channel,無論收發都會被阻塞。

本文標題: go語言的channel遍歷方法詳解

本文位址: /jiaoben/golang/388924.html

go語言 channel特點

通道擁有阻塞機制 無緩衝區 有緩衝區同理。接收端在傳送端資料傳送完成之前 通道為nil 處於阻塞狀態 傳送端在接收端資料拿走完成之前 通道為滿 處於阻塞態 1.struct 型別不佔空間,作為通道的一種訊號方式 2.chan型別為引用型別,故需要進行初始化,申請空間,在通道使用結束後close 關閉...

go 通道 go語言通道channel

通過使用通道,在多個goroutine傳送和接受共享的資料,達到資料同步的目的。通道,他有點像在兩個routine之間架設的管道,乙個goroutine可以往這個管道裡塞資料,另外乙個可以從這個管道裡取資料,有點類似於我們說的佇列。宣告乙個通道很簡單,我們使用chan關鍵字即可,除此之外,還要指定通...

Go語言學習 channel

channel俗稱管道,用於資料傳遞或資料共享,其本質是乙個先進先出的佇列,使用goroutine channel進行資料通訊簡單高效,同時也執行緒安全,多個goroutine可同時修改乙個channel,不需要加鎖。channel可分為三種型別 channel使用 定義和宣告 var readon...