go語言編程之select信道處理示例詳解
更新時間:2022年04月14日 08:27:29 作者:Jeff的技術棧
這篇文章主要為大家介紹了go語言編程之select信道處理示例詳解,<BR>有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪
select信道處理
注意:有default就不會阻塞
package main func main() { var chan1 = make(chan int) var chan2 = make(chan int) select { case <-chan1: // 如果chan1成功讀到數據,則進行該case處理語句 case chan2: // 如果chan2成功讀到數據,則進行該case處理語句 default: // 如果上面都沒有成功,則進行該case處理語句 } }
fibonacci數列監(jiān)聽
//fibonacci 1 1 2 3 5 8 package main import ( "fmt" ) //ch只寫,quit只讀 func fibonacci(ch chan<- int, quit <-chan bool) { x, y := 1, 1 for { //監(jiān)聽channel數據的流動 select { case ch <- x: x, y = y, x+y case flag := <-quit: fmt.Println("flag = ", flag) return } } } func main() { ch := make(chan int) //數字通信 quit := make(chan bool) //程序是否結束 //消費者,從channel讀取內容 //新建協(xié)程 go func() { for i := 0; i < 8; i++ { num := <-ch fmt.Println(num) } //可以停止 quit <- true }() //別忘了() //生產者,產生數字,寫入channel fibonacci(ch, quit) } 1 1 2 3 5 8 13 21 flag = true
select監(jiān)聽協(xié)程
func main() { //創(chuàng)建一個有緩存的channel ch := make(chan int, 0) //len(ch)緩沖區(qū)剩余數據個數, cap(ch)緩沖區(qū)大小 //新建協(xié)程 go func() { for i := 0; i < 10; i++ { ch <- i //往chan寫內容 } }() ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second) go func(ctx context.Context) { ticker := time.NewTicker(1 * time.Second) for _ = range ticker.C { select { case <-ctx.Done(): fmt.Println("child process interrupt...") return default: fmt.Printf("send message: %d\n", <-ch) } } }(ctx) defer close(ch) defer cancel() select { case <-ctx.Done(): time.Sleep(1 * time.Second) fmt.Println("main process exit!") } }
以上就是go語言編程之select信道處理示例詳解的詳細內容,更多關于go語言select信道處理 的資料請關注腳本之家其它相關文章!
相關文章
Go 循環(huán)結構for循環(huán)使用教程全面講解
這篇文章主要為大家介紹了Go 循環(huán)結構for循環(huán)使用全面講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-10-10