深入剖析Go語言中的Select語句
更新時(shí)間:2023年12月11日 11:03:41 作者:奔跑的蝸牛.
select是Go中的一個(gè)控制結(jié)構(gòu),類似于switch語句,本文主要介紹了深入剖析Go語言中的Select語句,具有一定的參考價(jià)值,感興趣的可以了解一下
一、select多路復(fù)用
1、select說明
- 傳統(tǒng)的方法在遍歷管道時(shí),如果不關(guān)閉會(huì)阻塞而導(dǎo)致deadlock,在實(shí)際開發(fā)中,可能我們不好確定什么關(guān)閉該管道
- 這種方式雖然可以實(shí)現(xiàn)從多個(gè)管道接收值的需求,但是運(yùn)行性能會(huì)差很多
- 為了應(yīng)對(duì)這種場(chǎng)景,Go內(nèi)置了select關(guān)鍵字,可以同時(shí)響應(yīng)多個(gè)管道的操作
- select的使用類似于switch語句,它有一系列case分支和一個(gè)默認(rèn)的分支
- 每個(gè)case會(huì)對(duì)應(yīng)一個(gè)管道的通信(接收或發(fā)送)過程
- select會(huì)一直等待,直到某個(gè)case的通信操作完成時(shí),就會(huì)執(zhí)行case分支對(duì)應(yīng)的語句
具體格式如下:
select { case <- chan1: //如果chan1成功讀到數(shù)據(jù),則進(jìn)行該case處理語句 case chan2 <- 1 : //如果成功向chan2寫入數(shù)據(jù),則進(jìn)行該case處理語句 default : //如果上面都沒有成功,則進(jìn)入default處理流程 }
2、select的使用
- 使用select語句能提高代碼的可讀性
- 可處理一個(gè)或多個(gè)channel的發(fā)送/接收操作
- 如果多個(gè)caes同時(shí)滿足,select會(huì)隨機(jī)選擇一個(gè)
- 對(duì)于沒有case的select{}會(huì)一直等待,可用于阻塞main函數(shù)
package main import ( "fmt" "time" ) func main() { //在某些場(chǎng)景下我們需要同時(shí)從多個(gè)通道接收數(shù)據(jù),這個(gè)時(shí)候就可以用到golang中給我們提供的select多路復(fù)用 //定義一個(gè)管道10個(gè)數(shù)據(jù)int intChan := make(chan int,10) for i :=0;i<10;i++ { intChan <- i } //2.定義一個(gè)管道 5個(gè)數(shù)據(jù)string stringChan := make(chan string, 5) for i := 0; i < 5; i++ { stringChan <- "hello" + fmt.Sprintf("%d", i) } //使用select來獲取channel里面的數(shù)據(jù)的時(shí)候不需要關(guān)閉channel for { select { case v := <-intChan: fmt.Printf("從 intChan 讀取的數(shù)據(jù)%d\n", v) time.Sleep(time.Millisecond * 50) case v := <-stringChan: fmt.Printf("從 stringChan 讀取的數(shù)據(jù)%v\n", v) time.Sleep(time.Millisecond * 50) default: fmt.Printf("數(shù)據(jù)獲取完畢") return //注意退出... } } }
到此這篇關(guān)于深入剖析Go語言中的Select語句的文章就介紹到這了,更多相關(guān)Go語言Select語句內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
一文詳解如何在Golang中實(shí)現(xiàn)JWT認(rèn)證與授權(quán)
在現(xiàn)代Web應(yīng)用中,安全性是一個(gè)非常重要的課題,JWT作為一種常用的認(rèn)證與授權(quán)機(jī)制,已被廣泛應(yīng)用于各種系統(tǒng)中,下面我們就來看看如何在Golang中實(shí)現(xiàn)JWT認(rèn)證與授權(quán)吧2025-03-03使用Go語言中的Context取消協(xié)程執(zhí)行的操作代碼
在 Go 語言中,協(xié)程(goroutine)是一種輕量級(jí)的線程,非常適合處理并發(fā)任務(wù),然而,如何優(yōu)雅地取消正在運(yùn)行的協(xié)程是一個(gè)常見的問題,本文將通過一個(gè)具體的例子來展示如何使用 context 包來取消協(xié)程的執(zhí)行,需要的朋友可以參考下2024-11-11Go?Excelize?API源碼閱讀Close及NewSheet方法示例解析
這篇文章主要為大家介紹了Go?Excelize?API源碼閱讀Close及NewSheet方法示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08Go高級(jí)特性探究之處理1分鐘百萬請(qǐng)求詳解
對(duì)于大型的互聯(lián)網(wǎng)應(yīng)用程序,如電商平臺(tái)、社交網(wǎng)絡(luò)、金融交易平臺(tái)等,每秒鐘都會(huì)收到大量的請(qǐng)求,那么Go是如何處理這些百萬請(qǐng)求的呢,下面就來和大家詳細(xì)講講2023-06-06golang?chan傳遞數(shù)據(jù)的性能開銷詳解
這篇文章主要為大家詳細(xì)介紹了Golang中chan在接收和發(fā)送數(shù)據(jù)時(shí)因?yàn)椤皬?fù)制”而產(chǎn)生的開銷,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下2024-01-01