最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Go語言面試題之select和channel的用法

 更新時間:2022年09月06日 11:38:53   作者:王中陽Go  
金九銀十面試季到了(PS:貌似今年一年都是面試季),就業(yè)環(huán)境很差,導致從業(yè)人員不得不卷。本文將重點講解一下Go面試進階知識點之select和channel,需要的可以參考一下

select

先說switch...case...

switch...case... 很常用,且很好理解。其作用和if...else...一樣。

區(qū)別是switch...case 相比于if...else...能讓我們的代碼看起來更清晰,更好理解。

再說select...case..

golang 的 select 就是監(jiān)聽 IO 操作,當 IO 操作發(fā)生時,觸發(fā)相應的動作。 

所說的IO操作就是對channle的操作:向通道發(fā)送數(shù)據(jù),或者從通道中讀取數(shù)據(jù)。

在執(zhí)行select語句的時候,運行時系統(tǒng)會自上而下地判斷每個case中的發(fā)送或接收操作是否可以被立即執(zhí)行。

什么是立即執(zhí)行呢?

立即執(zhí)行:意思是當前Goroutine不會因當前操作而被阻塞

select類比switch

select的用法與switch非常類似,由select開始一個新的選擇塊,每個選擇條件由case語句來描述。

與switch語句可以選擇任何可使用相等比較的條件相比,select有比較多的限制,其中最大的一條限制就是每個case語句里必須是一個IO操作。

確切的說,應該是一個面向channel的IO操作。

經(jīng)典示例

package main

import "fmt"

func main() {
   ch1 := make(chan int, 1)
   ch1 <- 2
   select {
   case v := <-ch1:
      fmt.Println("取到的數(shù)據(jù):", v)
   case ch1 <- 1:
      fmt.Println("寫入數(shù)據(jù)")
   }
}

運行結果

channel

goroutine和channel作為go語言中最重要的兩個知識點,一定要搞清楚。

大家容易出錯的知識點是以下3點,尤其是最后一點:

1.nil channel代表channel未初始化,向未初始化的channel讀寫數(shù)據(jù)會造成阻塞

2.關閉(close)未初始化的channel會引起panic。

3.從一個關閉的并且沒有值的通道執(zhí)行接收操作會得到對應類型的零值,并不會引起panic。

1.從已經(jīng)關閉并且沒有值的通道中取值

package main

import "fmt"

//從關閉的通道中取值示例:
func main() {
   //聲明實例化通道ch1
   ch1 := make(chan int, 1)
   //關閉通道
   close(ch1)
   select {
   //通通道ch1中取值
   case v := <-ch1:
      fmt.Printf("從ch1中取值:%d\n", v)
   default:
      fmt.Println("默認case")
   }
}

運行結果

和我們預想中的一樣,取到了對應的零值:

2.從已經(jīng)關閉并且有值的通道中取值

我們稍微修改一下上面的代碼

package main

import "fmt"

//從關閉的通道中取值示例:
func main() {
   //聲明實例化通道ch1
   ch1 := make(chan int, 1)
   //向通道中賦值
   ch1 <- 1
   //關閉通道
   close(ch1)
   //關閉之后取值
   after_close_value := <-ch1
   fmt.Printf("關閉之后取值:%d\n", after_close_value) //打印結果:關閉之后取值:1
   select {
   //通通道ch1中取值
   case v := <-ch1:
      fmt.Printf("從ch1中取值:%d\n", v) //打印結果:從ch1中取值:0
   default:
      fmt.Println("默認case")
   }
}

運行結果

運行結果和我們預想中的一樣:

  • 通道關閉后,如果通道中仍然有值,還是可以正常取到通道中的值的。
  • 通道關閉后,如果通道中已經(jīng)沒有值了,再從通道中取值,并不會引起panic,而是會取到對應類型的零值。

一圖勝千言

下面的表格中總結了對不同狀態(tài)下的通道執(zhí)行相應操作的結果。

注意: 對已經(jīng)關閉的通道再執(zhí)行 close 也會引發(fā) panic。

總結

本文解析了Go語言中select和channel在面試中可能遇到的進階知識點。

到此這篇關于Go語言面試題之select和channel的用法的文章就介紹到這了,更多相關Go select channel內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • go語言更高精度的Sleep實例解析

    go語言更高精度的Sleep實例解析

    這篇文章主要為大家介紹了go語言更高精度的Sleep實例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-12-12
  • Go數(shù)據(jù)庫遷移的實現(xiàn)步驟

    Go數(shù)據(jù)庫遷移的實現(xiàn)步驟

    本文主要介紹了Go數(shù)據(jù)庫遷移的實現(xiàn)步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-07-07
  • Go語言利用接口實現(xiàn)鏈表插入功能詳解

    Go語言利用接口實現(xiàn)鏈表插入功能詳解

    這篇文章主要為大家介紹了Go語言中的接口,以及如何利用接口實現(xiàn)鏈表插入功能,文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下
    2022-04-04
  • Go語言使用make進行內(nèi)存分配的代碼示例

    Go語言使用make進行內(nèi)存分配的代碼示例

    在Go語言里,內(nèi)存分配是程序開發(fā)中的關鍵環(huán)節(jié),make是Go語言內(nèi)置的一個重要函數(shù),專門用于為切片(slice)、映射(map)和通道(channel)這三種引用類型分配內(nèi)存并初始化,本文將深入剖析 make 函數(shù)的使用,結合代碼示例與實際項目場景,幫助開發(fā)者更好地掌握這一特性
    2025-06-06
  • Go語言對字符串進行MD5加密的方法

    Go語言對字符串進行MD5加密的方法

    這篇文章主要介紹了Go語言對字符串進行MD5加密的方法,實例分析了Go語言對字符串進行md5加密的技巧,需要的朋友可以參考下
    2015-03-03
  • Go語言實現(xiàn)可靠的UDP 協(xié)議的示例詳解

    Go語言實現(xiàn)可靠的UDP 協(xié)議的示例詳解

    UDP(用戶數(shù)據(jù)報協(xié)議)是一種無連接、輕量級的傳輸層協(xié)議,這篇文章主要為大家詳細介紹了如何使用Go語言實現(xiàn)可靠的UDP 協(xié)議,需要的小伙伴可以了解下
    2025-07-07
  • go程序執(zhí)行交叉編譯的流程步驟

    go程序執(zhí)行交叉編譯的流程步驟

    go程序可用通過交叉編譯的方式在一個平臺輸出多個平臺可運行的二進制包,本文給大家詳細介紹了go程序執(zhí)行交叉編譯的流程步驟,文中有詳細的代碼示例供大家參考,需要的朋友可以參考下
    2024-07-07
  • Go語言基礎go doc命令用法及示例詳解

    Go語言基礎go doc命令用法及示例詳解

    這篇文章主要為大家介紹了Go語言基礎go doc命令的用法及示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助祝大家多多進步
    2021-11-11
  • 解析go語言調(diào)用約定多返回值實現(xiàn)原理

    解析go語言調(diào)用約定多返回值實現(xiàn)原理

    這篇文章主要為大家介紹了解析go語言調(diào)用約定多返回值實現(xiàn)原理,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-05-05
  • 利用golang和shell計算一個字符串的md5值

    利用golang和shell計算一個字符串的md5值

    這篇文章主要介紹了如何利用golang和shell計算一個字符串的md5值,我們先用shell來計算一下,再去判斷golang計算的md5值是否正確,文中有詳細的圖文介紹,需要的朋友可以參考下
    2024-03-03

最新評論

平昌县| 黄龙县| 田阳县| 齐河县| 绿春县| 敦化市| 霍山县| 虞城县| 华容县| 宜川县| 从化市| 泸溪县| 图们市| 石柱| 通榆县| 漠河县| 苗栗县| 东阳市| 巩留县| 河源市| 台山市| 永宁县| 阜新| 巍山| 台山市| 高雄县| 炎陵县| 墨玉县| 南溪县| 绥宁县| 南郑县| 安乡县| 西昌市| 丹棱县| 龙海市| 犍为县| 德清县| 花垣县| 金溪县| 巴里| 日照市|