Hello,大家好,又見面了!上一遍我們將 channel 相關基礎以及使用場景。這一篇,還需要再次進階理解channel 阻塞問題。以下創建一個chan類型為int,cap 為3。

創新互聯是一家專業提供溫嶺企業網站建設,專注與成都網站制作、網站設計、外貿網站建設、H5場景定制、小程序制作等業務。10年已為溫嶺眾多企業、政府機構等服務。創新互聯專業網絡公司優惠進行中。
channel 內部其實是一個環形buf數據結構 ,是一種滑動窗口機制,當make完后,就分配在 Heap 上。
上面,向 chan 發送一條“hello”數據:
如果 G1 發送數據超過指定cap時,會出現什么情況?
看下面實例:
以上會出現什么,chan 緩沖區允許大小為1,如果再往chan仍數據,滿了就會被阻塞,那么是如何實現阻塞的呢?當 chan 滿時,會進入 gopark,此時 G1 進入一個 waiting 狀態,然后會創建一個 sudog 對象,其實就sendq隊列,把 200放進去。等 buf 不滿的時候,再喚醒放入buf里面。
通過如下源碼,你會更加清晰:
上面,從 chan 獲取數據:
Go 語言核心思想:“Do not communicate by sharing memory; instead, share memory by communicating.” 你可以看看這本書名叫:Effective Go
如果接收者,接收一個空對象,也會發生什么情況?
代碼示例 :
也會報錯如下:
上面,從 chan 取出數據,可是沒有數據了。此時,它會把 接收者 G2 阻塞掉,也是和G1發送者一樣,也會執行 gopark 將狀態改為 waiting,不一樣的點就是。
正常情況下,接收者G2作為取出數據是去 buf 讀取數據的,但現在,buf 為空了,此時,接收者G2會將sudog導出來,因為現在G2已經被阻塞了嘛,會把G2給G,然后將 t := -ch 中變量 t 是在棧上的地址,放進去 elem ,也就是說,只存它的地址指針在sudog里面。
最后, ch - 200 當G1往 chan 添加200這個數據,正常情況是將數據添加到buf里面,然后喚醒 G2 是吧,而現在是將 G1 的添加200數據直接干到剛才G2阻塞的t這里變量里面。
你會認為,這樣真的可以嗎?想一想,G2 本來就是已經阻塞了,然后我們直接這么干肯定沒有什么毛病,而且效率提高了,不需要再次放入buf再取出,這個過程也是需要時間。不然,不得往chan添加數據需要加鎖、拷貝、解鎖一序列操作,那肯定就慢了,我想Go語言是為了高效及內存使用率的考慮這樣設計的。(注意,一般都是在runtime里面完成,不然會出現象安全問題。)
總結 :
chan 類型的特點:chan 如果為空,receiver 接收數據的時候就會阻塞等待,直到 chan 被關閉或者有新的數據到來。有這種個機制,就可以實現 wait/notify 的設計模式。
相關面試題:
使用go語言的好處: go語言的設計是務實的, go在針對并發上進行了優化, 并且支持大規模高并發, 又由于單一的碼格式, 相比于其他語言更具有可讀性, 在垃圾回收上比java和Python更有效, 因為他是和程序同時執行的.
1. 進程, 線程, 協程的區別, 協程的優勢
2. 講一下GMP模型(重點)
3. Go的GC, 混合寫屏障(重點)
4. go的Slice和數組的區別, slice的擴容原理(重點)
5. 講一下channel,實現原理(重點)
6. 講一下Go的Map的實現原理, 是否線程安全, 如何實現安全(重點)
7. new 和 make 的區別
8. 說一下內存逃逸
9. 函數傳指針和傳值有什么區別
10. goroutine之間的通信方式
11. 測試是怎么做的(單元測試, 壓力測試)
12. 堆和棧的區別
error。Go語言又稱Golang是Google開發的一種靜態強類型、編譯型、并發型,并具有垃圾回收功能的編程語言,在該語言種類中error不屬于異常處理的關鍵詞,因為error僅僅是用來提示錯誤的詞,和異常處理功能無關。
go語言中的if語句和其他語言中的類似,都是根據給定的條件表達式運算結果來,判斷執行流程。
注意:在go語言中 布爾表達式不用使用括號。
根據布爾值flag判斷
程序運行結果
初始變量可以聲明在布爾表達式里面,注意它的作用域
程序運行結果
注意:不能使用0或非0表示真假
go語言if語句使用提示:
go語言中的if else語句可以根據給定條件二選一。
比較兩個數的大小
運行結果
判斷一個數是奇數還是偶數
運行結果
判斷一個人是否成年
運行結果
特殊寫法,在if前面添加執行語句
運行結果
go語言if語句使用提示:
go語言if語句可以進行多重嵌套使用,進行多重判斷。
根據分數判斷等級
運行結果
同樣也可以寫成這樣
運行結果
輸入星期幾的第一個字母來判斷一下是星期幾,如果第一個字母一樣,則繼續判斷第二個字母
運行結果
go語言if語句可以嵌套多級進行判斷。
判斷三個數的大小
運行結果
判斷男生還是女生,還有是否成年
運行結果
網站名稱:go語言考題 go語言題目
URL分享:http://www.js-pz168.com/article38/doiposp.html
成都網站建設公司_創新互聯,為您提供自適應網站、全網營銷推廣、手機網站建設、定制網站、軟件開發、外貿建站
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯