<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                select 語句 select 語句類似于 switch 語句,但是select會隨機執行一個可運行的case。如果沒有case可運行,它將阻塞,直到有case可運行。 select 是Go中的一個控制結構,類似于用于通信的switch語句。每個case必須是一個通信操作,要么是發送要么是接收。 select 隨機執行一個可運行的case。如果沒有case可運行,它將阻塞,直到有case可運行。一個默認的子句應該總是可運行的。 語法 Go 編程語言中 select 語句的語法如下: ~~~ select { case communication clause : statement(s); case communication clause : statement(s); /* 你可以定義任意數量的 case */ default : /* 可選 */ statement(s); } ~~~ 以下描述了 select 語句的語法: ~~~ 每個case都必須是一個通信 所有channel表達式都會被求值 所有被發送的表達式都會被求值 如果任意某個通信可以進行,它就執行;其他被忽略。 如果有多個case都可以運行,Select會隨機公平地選出一個執行。其他不會執行。 否則: 如果有default子句,則執行該語句。 如果沒有default字句,select將阻塞,直到某個通信可以運行;Go不會重新對channel或值進行求值。 ~~~ 實例: ~~~ package main import "fmt" func main() { var c1, c2, c3 chan int var i1, i2 int select { case i1 = <-c1: fmt.Printf("received ", i1, " from c1\n") case c2 <- i2: fmt.Printf("sent ", i2, " to c2\n") case i3, ok := (<-c3): // same as: i3, ok := <-c3 if ok { fmt.Printf("received ", i3, " from c3\n") } else { fmt.Printf("c3 is closed\n") } default: fmt.Printf("no communication\n") } } ~~~ 以上代碼執行結果為: ~~~ no communication ~~~ select可以監聽channel的數據流動 select的用法與switch語法非常類似,由select開始的一個新的選擇塊,每個選擇條件由case語句來描述 與switch語句可以選擇任何使用相等比較的條件相比,select由比較多的限制,其中最大的一條限制就是每個case語句里必須是一個IO操作 ~~~ select { //不停的在這里檢測 case <-chanl : //檢測有沒有數據可以讀 //如果chanl成功讀取到數據,則進行該case處理語句 case chan2 <- 1 : //檢測有沒有可以寫 //如果成功向chan2寫入數據,則進行該case處理語句 //假如沒有default,那么在以上兩個條件都不成立的情況下,就會在此阻塞//一般default會不寫在里面,select中的default子句總是可運行的,因為會很消耗CPU資源 default: //如果以上都沒有符合條件,那么則進行default處理流程 } ~~~ 在一個select語句中,Go會按順序從頭到尾評估每一個發送和接收的語句。 如果其中的任意一個語句可以繼續執行(即沒有被阻塞),那么就從那些可以執行的語句中任意選擇一條來使用。 如果沒有任意一條語句可以執行(即所有的通道都被阻塞),那么有兩種可能的情況: ①如果給出了default語句,那么就會執行default的流程,同時程序的執行會從select語句后的語句中恢復。 ②如果沒有default語句,那么select語句將被阻塞,直到至少有一個case可以進行下去。 Golang select的使用及典型用法 基本使用 select是Go中的一個控制結構,類似于switch語句,用于處理異步IO操作。select會監聽case語句中channel的讀寫操作,當case中channel讀寫操作為非阻塞狀態(即能讀寫)時,將會觸發相應的動作。 select中的case語句必須是一個channel操作 select中的default子句總是可運行的。 如果有多個case都可以運行,select會隨機公平地選出一個執行,其他不會執行。 如果沒有可運行的case語句,且有default語句,那么就會執行default的動作。 如果沒有可運行的case語句,且沒有default語句,select將阻塞,直到某個case通信可以運行 例如: ~~~ package main import "fmt" func main() { var c1, c2, c3 chan int var i1, i2 int select { case i1 = <-c1: fmt.Printf("received ", i1, " from c1\n") case c2 <- i2: fmt.Printf("sent ", i2, " to c2\n") case i3, ok := (<-c3): // same as: i3, ok := <-c3 if ok { fmt.Printf("received ", i3, " from c3\n") } else { fmt.Printf("c3 is closed\n") } default: fmt.Printf("no communication\n") } } //輸出:no communication ~~~ 典型用法 1.超時判斷 ~~~ //比如在下面的場景中,使用全局resChan來接受response,如果時間超過3S,resChan中還沒有數據返回,則第二條case將執行 var resChan = make(chan int) // do request func test() { select { case data := <-resChan: doData(data) case <-time.After(time.Second * 3): fmt.Println("request time out") } } func doData(data int) { //... } ~~~ 2.退出 ~~~ //主線程(協程)中如下: var shouldQuit=make(chan struct{}) fun main(){ { //loop } //...out of the loop select { case <-c.shouldQuit: cleanUp() return default: } //... } //再另外一個協程中,如果運行遇到非法操作或不可處理的錯誤,就向shouldQuit發送數據通知程序停止運行 close(shouldQuit) ~~~ 3.判斷channel是否阻塞 ~~~ //在某些情況下是存在不希望channel緩存滿了的需求的,可以用如下方法判斷 ch := make (chan int, 5) //... data:=0 select { case ch <- data: default: //做相應操作,比如丟棄data。視需求而定 } ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看