<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在golang語言中,select語句 就是用來監聽和channel有關的IO操作,當IO操作發生時,觸發相應的case動作。有了 select語句,可以實現 main主執行緒 與 goroutine執行緒 之間的互動。
select { case <-ch1 : // 檢測有沒有資料可讀 // 一旦成功讀取到資料,則進行該case處理語句 case ch2 <- 1 : // 檢測有沒有資料可寫 // 一旦成功向ch2寫入資料,則進行該case處理語句 default: // 如果以上都沒有符合條件,那麼進入default處理流程 }
注意事項:
先建立兩個通道,並在 select 前往 c2 傳送資料
package main import ( "fmt" ) //go的通道選擇器 讓你可以同時等待多個通道操作。go協程和通道以及選擇器的結合是go的一個強大特性。 func main() { // 在我們的例子中,我們將從兩個通道中選擇。 c1 := make(chan string, 1) c2 := make(chan string, 1) c2 <- "nihao" //go func() { // time.Sleep(time.Second * 1) // c1 <- "one" //}() // //go func() { // time.Sleep(time.Second * 2) // c2 <- "two" //}() //我們使用 `select` 關鍵字來同時等待這兩個值,並列印各自接收到的值。 //for i := 0; i < 2; i++ { select { case msg1 := <-c1: fmt.Println("received", msg1) case msg2 := <-c2: fmt.Println("received", msg2) default: fmt.Println("No data received") } //} }
在執行 select 時,會遍歷所有(如果有機會的話)的 case 表示式,只要有一個通道有接收到資料,那麼 select 就結束,所以輸出如下
select 在執行過程中,必須命中其中的某一分支。
如果在遍歷完所有的 case 後,若沒有命中(命中:也許這樣描述不太準確,我本意是想說可以執行通道的操作語句)任何一個 case 表示式,就會進入 default 裡的程式碼分支。
package main import ( "fmt" ) //go的通道選擇器 讓你可以同時等待多個通道操作。go協程和通道以及選擇器的結合是go的一個強大特性。 func main() { // 在我們的例子中,我們將從兩個通道中選擇。 c1 := make(chan string, 1) c2 := make(chan string, 1) //c2 <- "nihao" //go func() { // time.Sleep(time.Second * 1) // c1 <- "one" //}() // //go func() { // time.Sleep(time.Second * 2) // c2 <- "two" //}() //我們使用 `select` 關鍵字來同時等待這兩個值,並列印各自接收到的值。 //for i := 0; i < 2; i++ { select { case msg1 := <-c1: fmt.Println("received", msg1) case msg2 := <-c2: fmt.Println("received", msg2) //default: // fmt.Println("No data received") //} } }
但如果你沒有寫 default 分支,select 就會阻塞,直到有某個 case 可以命中,而如果一直沒有命中,select 就會丟擲 deadlock
的錯誤,就像下面這樣子。
1.解決這個問題的方法有兩種
一個是,養成好習慣,在 select 的時候,也寫好 default 分支程式碼,儘管你 default 下沒有寫任何程式碼。
另一個是,讓其中某一個通道可以接收到資料
之前學過 switch 的時候,知道了 switch 裡的 case 是順序執行的,但在 select 裡卻不是。
通過下面這個例子的執行結果就可以看出
當 case 裡的通道始終沒有接收到資料時,而且也沒有 default 語句時,select 整體就會阻塞,但是有時我們並不希望 select 一直阻塞下去,這時候就可以手動設定一個超時時間。
上面例子裡的 case,好像都只從通道中讀取資料,但實際上,select 裡的 case 表示式只要求你是對通道的操作即可,不管你是往通道寫入資料,還是從通道讀出資料。
select 與 switch 原理很相似,但它的使用場景更特殊,學習了本篇文章,你需要知道如下幾點區別:
到此這篇關於golang中select語句的文章就介紹到這了,更多相關go中select語句內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45