12 Go語言基礎 通道 channel

2021-10-02 05:34:23 字數 3024 閱讀 6830

說道通道:channel,不得不提go語言的併發程式設計模型:csp。

go語言提倡,通過通訊來共享記憶體。

goroutines:可以看做是go的乙個併發執行緒。基於系統執行緒。

每啟動乙個goroutine的堆初始化占用是2/4k,可以擴大到1g。這也是go語言可以啟動成千上萬個goroutine的原因。

啟動乙個goroutine只需要再函式呼叫前加乙個關鍵字go :go myfunc()

通道channel就是作為這些goroutine之間相互通訊、共享資料的渠道,準確的說就是通道。

channel是引用型別,多個名字指向乙個channel例項是,乙個關閉全部關閉。

channel分為雙向通道、唯讀通道、只寫信道。可以通過close()函式關閉通道。

關閉的通道只可以讀不可以寫(只寫的不可讀)。

channel帶緩衝區和不帶緩衝區的區別:

不帶緩衝區寫入乙個在寫入就會阻塞。帶緩衝區就是比不帶緩衝區的多寫帶的緩衝區大小個數的資料,再寫也會阻塞。

建立channel

var ch1 chan int建立的ch1是nil值,讀取會阻塞,寫入會阻塞,close()會panic。除非特殊需求,不要這樣建立channel;

推薦使用make()建立channel。

//雙向channel

var ch1=

make

(chan

int)

//唯讀

var ch2=

make

(<-

chan

int)

//只寫

var ch3=

make

(chan

int<-

)

package main

import

("fmt"

)func

main()

close

(ch)

}(ch1)

for}

=>

這裡列印外0~9,會一直列印0,因為ch1被close了,<-ch1讀取到的返回值一直是0

這裡列印外0~9,會一直列印0,因為ch1被close了,<-ch1讀取到的返回值一直是0。

使用_,ok判斷channel是否關閉

上面的問題怎麼改正?使用ok布林值判斷是否關閉。

讀已關閉的channel會得到零值,如果不確定channel,需要使用ok進行檢測。ok的結果和含義:

true:讀到資料,並且通道沒有關閉。

false:通道關閉,無資料讀到。

for

else}=

>

res:

0res:

1res:

2res:

3res:

4res:

5res:

6res:

7res:

8res:

9正常退出。

使用for range讀channel

使用for range讀取channel,讀完也會退出。

場景:當需要不斷從channel讀取資料時。

使用for-range讀取channel,這樣既安全又便利,當channel關閉時,for迴圈會自動退出,無需主動監測channel是否關閉,可以防止讀取已經關閉的channel,造成讀到資料為通道所儲存的資料型別的零值。

for res:=

range ch1

select處理多個channel

select可以同時監控多個通道的情況,只處理未阻塞的case。當通道為nil時,對應的case永遠為阻塞,無論讀寫。特殊關注:普通情況下,對nil的通道寫操作是要panic的。

for

}

select中使用超時

for

}

唯讀只寫信道的作用

雙向通道可以隱身轉換為唯讀或者只寫信道。但是唯讀或者只寫信道不能轉換為雙向或別的通道。

唯讀通道可以在只需要讀寫的函式內使用,防止函式內部誤寫入。只寫也是如此。

package main

import

("fmt"

"time"

)func

main()

}(ch1)

gofunc

(ch <-

chan

int)

}(ch1)

time.

sleep(10

*time.second)}=》

res:

0res:

1res:

2res:

3res:

4res:

5res:

6res:

7res:

8res:

9

使用帶快取的channel控制併發

package main

import

("time"

"fmt"

)func

process

(ch chan

int)

func

main()

for i, ch :=

range channels

}

channel做同步,最簡單的生產者消費者

package main

// 帶緩衝區的channel

import

("fmt"

"time"

)func

produce

(ch chan

<-

int)

}func

consumer

(ch <-

chan

int)

}func

main()

12 Go語言基礎之map

go語言中提供的對映關係容器為map,其內部使用雜湊表 hash 實現。map是一種無序的基於key value的資料結構,go語言中的map是引用型別,必須初始化才能使用。map的定義語法如下 map keytype valuetype其中 map型別的變數預設初始值為nil,需要使用make 函...

1 2Go語言安裝

go語言編譯器及輔助工具可用於 windows macos 和linux 等作業系統。推薦盡可能使用作業系統自帶的包管理器來安裝go語言的 二進位制發行包 如 windows go1.11.4.windows amd64.msi maxos go1.11.4.darwin amd64.pkg lin...

12 Go語言 反射詳解

1.反射定義 可以在執行時動態獲取變數的相關資訊。import reflect 官方對此有個非常簡明的介紹,兩句話耐人尋味 反射提供一種讓程式檢查自身結構的能力。再精確點的描述是 反射是一種檢查inte ce變數的底層型別和值的機制 反射是困惑的源泉 想深入了解反射,必須深入理解型別和介面概念。2....