<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 ~~~ 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>

                              哎呀哎呀视频在线观看