日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

golang中的select详解

發布時間:2025/6/15 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 golang中的select详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

注意

  • 監聽的case中,沒有滿足條件的就阻塞
  • 多個滿足條件的就任選一個執行
  • select本身不帶循環,需要外層的for
  • default通常不用,會產生忙輪詢
  • break只能跳出select中的一個case
  • 加入了默認分支,那么無論涉及通道操作的表達式是否有阻塞,select語句都不會被阻塞。如果那幾個表達式都阻塞了,或者說都沒有滿足求值的條件,那么默認分支就會被選中并執行。

  • 如果沒有加入默認分支,那么一旦所有的case表達式都沒有滿足求值條件,那么select語句就會被阻塞。直到至少有一個case表達式滿足條件為止。

  • 如果select語句發現同時有多個候選分支滿足選擇條件,那么它就會用一種偽隨機的算法在這些分支中選擇一個并執行。注意,即使select語句是在被喚醒時發現的這種情況,也會這樣做

    作用

    go里面提供了一個關鍵字select,通過select可以監聽channel上的數據流動

    select的用法與switch語言非常類似,由select開始一個新的選擇塊,每個選擇塊條件由case語句來描述

    與switch語句可以選擇任何可使用相等比較的條件相比,select有比較多的限制,其中最大的一條限制就是每個case語句里必須是一個IO操作

    for {select {case <-chan1://.....case chan2<-1://....default://都沒成功,進入......} }

    在一個select語句中,go語言會按順序從頭到尾評估每一個發送和接收的語句

    如果其中的任意一語句可以繼續執行(即沒有被阻塞),那么就從哪些可以執行的語句中任意選擇一條來使用

    如果沒有任意一條語句可以執行(即所有的通道都被阻塞),那么有兩種可能的情況:

    • 如果給出了default語句,那么就會執行default語句,同時程序的執行會從select語句后的語句中恢復
    • 如果沒有default語句,那么select語句將被阻塞,直到至少有一個通信可以進行下去

    防止channel超時機制

    有時候會出現協程阻塞的情況,那么我們如何避免這個情況?我們可以使用select來設置超時

    func main() {c := make(chan int)o := make(chan bool)go func() {for {select {case v:= <-c:fmt.Println(v)//5秒鐘自動關閉,避免長時間超時case <-time.After(5 * time.Second):fmt.Println("timeout")o<-truebreak}}}()//有值就主協程走,主協程走完就都沒了<-ofmt.Println("程序結束") }

    總結

    以上是生活随笔為你收集整理的golang中的select详解的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。