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

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                ## 多路復用 Linux本身有個select的多路復用的模型,golang的多路復用使用select關鍵字的原因可能就是來源于這里吧. 1. 在select沒有case的情況下,它會阻塞當前的goroutine. 2. 每一個case都必須是一個channel通信. 3. select的執行跟**case的順序沒有關系**.哪個case有通信活動了,就去執行哪一個. 4. 當一個case可以被執行的時候,其他的所有case將會被忽略,程序代碼將繼續向下執行.跳過所有被忽略的case. 5. 如果沒有一個case可以被執行,則去執行default. 6. 如果沒有default,select將會阻塞,直到有case可以被執行. 7. 多個case同時就緒時,select會隨機的選擇一個去執行,這樣保證每一個channel都有平等的被select的機會. ## 例1 可以看到,雖然timer2在timer1的下面,但是因為timer2早于timer1有通信活動,所以直接執行了timer2,并且timer2執行之后,直接跳出了select,并且忽略了timer1. ~~~ timer1 := time.NewTimer(2 * time.Second) timer2 := time.NewTimer(time.Second) select { case <-timer1.C: fmt.Println("timer1") case <-timer2.C: fmt.Println("timer2") } fmt.Println("done") ~~~ 結果: ``` timer2 done ``` ## 例2 因為timer1和timer2都需要等待,而此時的select是有default的,所以直接執行default,執行后跳出select. ~~~ timer1 := time.NewTimer(2 * time.Second) timer2 := time.NewTimer(time.Second) select { case <-timer1.C: fmt.Println("timer1") case <-timer2.C: fmt.Println("timer2") default: fmt.Println("default") } fmt.Println("done") ~~~ 結果: ``` default done ``` ## 例3 ~~~ abort := make(chan struct{}) go func() { os.Stdin.Read(make([]byte, 1)) abort <- struct{}{} }() tick := time.NewTicker(time.Second) defer tick.Stop() for i := 10; i > 0; i-- { select { case <-tick.C: fmt.Println(i) case <-abort: return } } fmt.Println("launch") ~~~
                  <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>

                              哎呀哎呀视频在线观看