<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智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                ## select常見案例 ## 1 題目1 下面的程序輸出是什么? ~~~go package main import ( "fmt" "time" ) func main() { chan1 := make(chan int) chan2 := make(chan int) go func() { chan1 <- 1 time.Sleep(5 * time.Second) }() go func() { chan2 <- 1 time.Sleep(5 * time.Second) }() select { case <-chan1: fmt.Println("chan1 ready.") case <-chan2: fmt.Println("chan2 ready.") default: fmt.Println("default") } fmt.Println("main exit.") } ~~~ 程序中聲明兩個channel,分別為chan1和chan2,依次啟動兩個協程,分別向兩個channel中寫入一個數據就進入睡眠。select語句兩個case分別檢測chan1和chan2是否可讀,如果都不可讀則執行default語句。 參考答案: select中各個case執行順序是隨機的,如果某個case中的channel已經ready,則執行相應的語句并退出select流程,如果所有case中的channel都未ready,則執行default中的語句然后退出select流程。另外,由于啟動的協程和select語句并不能保證執行順序,所以也有可能select執行時協程還未向channel中寫入數據,所以select直接執行default語句并退出。所以,以下三種輸出都有可能: 可能的輸出一: ~~~go chan1 ready. main exit. ~~~ 可能的輸出二: ~~~go chan2 ready. main exit. ~~~ 可能的輸出三: ~~~go default main exit. ~~~ ## 2.2 題目2 下面的程序執行到select時會發生什么? ~~~go package main import ( "fmt" "time" ) func main() { chan1 := make(chan int) chan2 := make(chan int) writeFlag := false go func() { for { if writeFlag { chan1 <- 1 } time.Sleep(time.Second) } }() go func() { for { if writeFlag { chan2 <- 1 } time.Sleep(time.Second) } }() select { case <-chan1: fmt.Println("chan1 ready.") case <-chan2: fmt.Println("chan2 ready.") } fmt.Println("main exit.") } ~~~ 程序中聲明兩個channel,分別為chan1和chan2,依次啟動兩個協程,協程會判斷一個bool類型的變量writeFlag來決定是否要向channel中寫入數據,由于writeFlag永遠為false,所以實際上協程什么也沒做。select語句兩個case分別檢測chan1和chan2是否可讀,這個select語句不包含default語句。 參考答案:select會按照隨機的順序檢測各case語句中channel是否ready,如果某個case中的channel已經ready則執行相應的case語句然后退出select流程,如果所有的channel都未ready且沒有default的話,則會阻塞等待各個channel。所以上述程序會一直阻塞。 ## 2.3 題目3 下面程序有什么問題? ~~~go package main import ( "fmt" ) func main() { chan1 := make(chan int) chan2 := make(chan int) go func() { close(chan1) }() go func() { close(chan2) }() select { case <-chan1: fmt.Println("chan1 ready.") case <-chan2: fmt.Println("chan2 ready.") } fmt.Println("main exit.") } ~~~ 程序中聲明兩個channel,分別為chan1和chan2,依次啟動兩個協程,協程分別關閉兩個channel。select語句兩個case分別檢測chan1和chan2是否可讀,這個select語句不包含default語句。 參考答案:select會按照隨機的順序檢測各case語句中channel是否ready,考慮到已關閉的channel也是可讀的,所以上述程序中select不會阻塞,具體執行哪個case語句具是隨機的。 ## 2.4 題目4 下面程序會發生什么? ~~~go package main func main() { select { } } ~~~ 上面程序中只有一個空的select語句。 參考答案:對于空的select語句,程序會被阻塞,準確的說是當前協程被阻塞,同時Golang自帶死鎖檢測機制,當發現當前協程再也沒有機會被喚醒時,則會panic。所以上述程序會panic
                  <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>

                              哎呀哎呀视频在线观看