深入剖析Go語言中的Select語句
更新時間:2023年12月11日 11:03:41 作者:奔跑的蝸牛.
select是Go中的一個控制結構,類似于switch語句,本文主要介紹了深入剖析Go語言中的Select語句,具有一定的參考價值,感興趣的可以了解一下
一、select多路復用
1、select說明
- 傳統(tǒng)的方法在遍歷管道時,如果不關閉會阻塞而導致deadlock,在實際開發(fā)中,可能我們不好確定什么關閉該管道
- 這種方式雖然可以實現(xiàn)從多個管道接收值的需求,但是運行性能會差很多
- 為了應對這種場景,Go內(nèi)置了select關鍵字,可以同時響應多個管道的操作
- select的使用類似于switch語句,它有一系列case分支和一個默認的分支
- 每個case會對應一個管道的通信(接收或發(fā)送)過程
- select會一直等待,直到某個case的通信操作完成時,就會執(zhí)行case分支對應的語句
具體格式如下:
select {
case <- chan1:
//如果chan1成功讀到數(shù)據(jù),則進行該case處理語句
case chan2 <- 1 :
//如果成功向chan2寫入數(shù)據(jù),則進行該case處理語句
default :
//如果上面都沒有成功,則進入default處理流程
}2、select的使用
- 使用select語句能提高代碼的可讀性
- 可處理一個或多個channel的發(fā)送/接收操作
- 如果多個caes同時滿足,select會隨機選擇一個
- 對于沒有case的select{}會一直等待,可用于阻塞main函數(shù)
package main
import (
"fmt"
"time"
)
func main() {
//在某些場景下我們需要同時從多個通道接收數(shù)據(jù),這個時候就可以用到golang中給我們提供的select多路復用
//定義一個管道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ù)的時候不需要關閉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 //注意退出...
}
}
}到此這篇關于深入剖析Go語言中的Select語句的文章就介紹到這了,更多相關Go語言Select語句內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
golang 實現(xiàn)tcp server端和client端,并計算RTT時間操作
這篇文章主要介紹了golang 實現(xiàn)tcp server端和client端,并計算RTT時間操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-12-12
Golang?Gin框架獲取請求參數(shù)的幾種常見方式
在我們平常添加路由處理函數(shù)之后,就可以在路由處理函數(shù)中編寫業(yè)務處理代碼了,但在此之前我們往往需要獲取請求參數(shù),本文就詳細的講解下gin獲取請求參數(shù)常見的幾種方式,需要的朋友可以參考下2024-02-02
Go語言中Struct與繼承與匿名字段和內(nèi)嵌結構體全面詳解
這篇文章主要介紹了Go語言中Struct與繼承與匿名字段和內(nèi)嵌結構體,Go語言中通過結構體的內(nèi)嵌再配合接口比面向對象具有更高的擴展性和靈活性,感興趣的可以了解一下2023-04-04
Golang高效實現(xiàn)內(nèi)網(wǎng)文件傳輸?shù)膶崙?zhàn)指南(含完整源碼)
這篇文章主要為大家詳細介紹了如何使用Golang實現(xiàn)一個高效的內(nèi)網(wǎng)文件傳輸系統(tǒng),從零構建協(xié)議實現(xiàn)斷點續(xù)傳與零拷貝,希望可以讓大家在實踐中真正理解底層技術的奧秘2025-12-12
Go語言結合GORM實現(xiàn)數(shù)據(jù)庫事務處理的示例代碼
這篇文章主要為大家詳細介紹了Go語言結合GORM實現(xiàn)數(shù)據(jù)庫事務處理的相關知識,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下2025-08-08
Go語言reflect.TypeOf()和reflect.Type通過反射獲取類型信息
這篇文章主要介紹了Go語言reflect.TypeOf()和reflect.Type通過反射獲取類型信息,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-04-04

