Go語言Select chan用法小結(jié)
select 語句是 Go 語言中用于處理多個(gè)通道操作的關(guān)鍵字,它允許你在多個(gè)通道上進(jìn)行非阻塞的選擇操作。select 語句可以用于以下幾種情況:
監(jiān)聽多個(gè)通道:你可以同時(shí)監(jiān)聽多個(gè)通道,一旦其中任何一個(gè)通道就緒(有數(shù)據(jù)可讀或可寫),select 就會(huì)選擇第一個(gè)就緒的通道執(zhí)行相關(guān)操作。
超時(shí)操作:你可以使用 select 結(jié)合定時(shí)器通道來實(shí)現(xiàn)超時(shí)操作,以確保不會(huì)無限期地等待通道操作完成。
避免阻塞:當(dāng)某個(gè)通道操作可能導(dǎo)致程序阻塞時(shí),select 可以幫助你避免阻塞,以保持程序的響應(yīng)性。
示例 1:監(jiān)聽多個(gè)通道
package main
import (
"fmt"
"time"
)
func main() {
ch1 := make(chan string)
ch2 := make(chan string)
go func() {
time.Sleep(2 * time.Second)
ch1 <- "Hello from ch1"
}()
go func() {
time.Sleep(1 * time.Second)
ch2 <- "Hello from ch2"
}()
select {
case msg1 := <-ch1:
fmt.Println(msg1)
case msg2 := <-ch2:
fmt.Println(msg2)
}
}在這個(gè)示例中,我們創(chuàng)建了兩個(gè)協(xié)程,每個(gè)協(xié)程向不同的通道發(fā)送消息。然后,在主協(xié)程中使用 select 語句監(jiān)聽兩個(gè)通道,一旦其中一個(gè)通道就緒,它就會(huì)打印相應(yīng)的消息。
示例 2:超時(shí)操作
package main
import (
"fmt"
"time"
)
func main() {
ch := make(chan string)
go func() {
time.Sleep(2 * time.Second)
ch <- "Hello from ch"
}()
select {
case msg := <-ch:
fmt.Println(msg)
case <-time.After(1 * time.Second):
fmt.Println("Timeout")
}
}在這個(gè)示例中,我們創(chuàng)建了一個(gè)協(xié)程,它會(huì)在2秒后向通道發(fā)送消息。然后,在主協(xié)程中使用 select 語句監(jiān)聽通道操作,但也使用 time.After 創(chuàng)建了一個(gè)1秒的超時(shí)定時(shí)器。如果通道操作沒有在1秒內(nèi)完成,超時(shí)分支會(huì)執(zhí)行,打印 “Timeout”。
示例 3:避免阻塞
package main
import (
"fmt"
"time"
)
func main() {
ch := make(chan string)
go func() {
time.Sleep(2 * time.Second)
ch <- "Hello from ch"
}()
select {
case msg := <-ch:
fmt.Println(msg)
default:
fmt.Println("No message received")
}
}在這個(gè)示例中,我們同樣創(chuàng)建了一個(gè)協(xié)程,但使用了 select 語句的默認(rèn)分支(default)。如果通道操作不能立即完成,default 分支會(huì)執(zhí)行,打印 “No message received”,而不會(huì)阻塞程序。
到此這篇關(guān)于Go語言Select chan用法小結(jié)的文章就介紹到這了,更多相關(guān)Go Select chan內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
golang打包成帶圖標(biāo)的exe可執(zhí)行文件
這篇文章主要給大家介紹了關(guān)于golang打包成帶圖標(biāo)的exe可執(zhí)行文件的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2023-06-06
go語言實(shí)現(xiàn)一個(gè)最簡(jiǎn)單的http文件服務(wù)器實(shí)例
這篇文章主要介紹了go語言實(shí)現(xiàn)一個(gè)最簡(jiǎn)單的http文件服務(wù)器的方法,實(shí)例分析了Go語言操作http的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-03-03
golang中值類型/指針類型的變量區(qū)別總結(jié)
golang的值類型和指針類型receiver一直是大家比較混淆的地方,下面這篇文章主要給大家總結(jié)介紹了關(guān)于golang中值類型/指針類型的變量區(qū)別的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下。2017-12-12
go日志系統(tǒng)logrus顯示文件和行號(hào)的操作
這篇文章主要介紹了go日志系統(tǒng)logrus顯示文件和行號(hào)的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-11-11
詳解Golang實(shí)現(xiàn)http重定向https的方式
這篇文章主要介紹了詳解Golang實(shí)現(xiàn)http重定向https的方式,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-08-08

