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

