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

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                [TOC] select是Go語言中的一個控制語句,它有select,case, default共同構成,與switch的書寫方式類似。**select只用來操作的channel的讀寫操作**。 *select 的特性* 1. 如果只有一個 case 語句評估通過,那么就執行這個case里的語句 2. 如果有多個 case 語句評估通過,那么通過隨機的方式隨機選一個 3. 如果 default 外的 case 語句都沒有通過評估,那么執行 default 里的語句 4. 如果沒有 default,那么 代碼塊會被阻塞,直到有一個 case 通過評估;否則一直阻塞 ## 示例1(多路select復用) ```go var ( swg sync.WaitGroup ) var ch1 = make(chan int, 3) var ch2 = make(chan string, 3) // 生產數據 func testProducer(i int) { defer swg.Done() // 多個case都符合的話,隨機選擇一個case執行 select { case ch1 <- i: fmt.Printf("ch1 send %v\n", i) case ch2 <- fmt.Sprintf("test%02d", i): fmt.Printf("ch2 send %v\n", fmt.Sprintf("test%02d", i)) } } // 消費數據 func testConsumer() { defer swg.Done() select { case i := <-ch1: fmt.Printf("ch1 received is %v\n", i) case s := <-ch2: fmt.Printf("ch2 received is %v\n", s) } } func main() { for i := 0; i < 10; i++ { swg.Add(1) go testProducer(i) } for i := 0; i < 4; i++ { swg.Add(1) go testConsumer() } swg.Wait() } // 運行結果 // ch1 send 3 // ch1 send 0 // ch1 send 2 // ch2 send test09 // ch2 received is test09 // ch1 received is 2 // ch2 send test01 // ch1 received is 3 // ch1 received is 0 // ch2 send test04 // ch1 send 7 // ch2 send test05 // ch1 send 8 // ch1 send 6 ``` ## 示例2(超時案例) ```go package main import ( "fmt" "sync" "time" ) var ( swg sync.WaitGroup ) func sendChan(ch chan string) { swg.Add(1) go func() { for i := 0; i < 5; i++ { // 休眠 i 秒 for j := 0; j < i; j++ { time.Sleep(time.Millisecond * 1000) } ch <- fmt.Sprintf("chan%02d", i) } swg.Done() }() } func main() { ch := make(chan string, 5) defer close(ch) defer swg.Wait() sendChan(ch) for j := 0; j < 5; j++ { select { case s := <-ch: fmt.Printf("ch received %v\n", s) case <-time.After(time.Second * 3): fmt.Println("Channel no data for more than three seconds") return } } } // 運行結果 // ch received chan00 // ch received chan01 // ch received chan02 // Channel no data for more than three seconds ```
                  <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>

                              哎呀哎呀视频在线观看