<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智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                ## range實現原理 對于for-range語句的實現,可以從編譯器源碼中找到答案。 編譯器源碼`gofrontend/go/statements.cc/For_range_statement::do_lower()`方法中有如下注釋。 ~~~go // Arrange to do a loop appropriate for the type. We will produce // for INIT ; COND ; POST { // ITER_INIT // INDEX = INDEX_TEMP // VALUE = VALUE_TEMP // If there is a value // original statements // } ~~~ 可見range實際上是一個C風格的循環結構。range支持數組、數組指針、切片、map和channel類型,對于不同類型有些細節上的差異 ## 1.1 range for slice 下面的注釋解釋了遍歷slice的過程: ~~~go // The loop we generate: // for_temp := range // len_temp := len(for_temp) // for index_temp = 0; index_temp < len_temp; index_temp++ { // value_temp = for_temp[index_temp] // index = index_temp // value = value_temp // original body // } ~~~ 遍歷slice前會先獲取slice的長度len\_temp作為循環次數,循環體中,每次循環會先獲取元素值,如果for-range中接收index和value的話,則會對index和value進行一次賦值。 由于循環開始前循環次數就已經確定了,所以循環過程中新添加的元素是沒辦法遍歷到的。 另外,數組與數組指針的遍歷過程與slice基本一致,不再贅述。 ## 1.2 range for map 下面的注釋解釋了遍歷map的過程: ~~~go // The loop we generate: // var hiter map_iteration_struct // for mapiterinit(type, range, &hiter); hiter.key != nil; mapiternext(&hiter) { // index_temp = *hiter.key // value_temp = *hiter.val // index = index_temp // value = value_temp // original body // } ~~~ 遍歷map時沒有指定循環次數,循環體與遍歷slice類似。由于map底層實現與slice不同,map底層使用hash表實現,插入數據位置是隨機的,所以遍歷過程中新插入的數據不能保證遍歷到。 ## 1.3 range for channel 遍歷channel是最特殊的,這是由channel的實現機制決定的: ~~~go // The loop we generate: // for { // index_temp, ok_temp = <-range // if !ok_temp { // break // } // index = index_temp // original body // } ~~~ channel遍歷是依次從channel中讀取數據,讀取前是不知道里面有多少個元素的。如果channel中沒有元素,則會阻塞等待,如果channel已被關閉,則會解除阻塞并退出循環。 注: * 上述注釋中index\_temp實際上描述是有誤的,應該為value\_temp,因為index對于channel是沒有意義的。 * 使用for-range遍歷channel時只能獲取一個返回值。
                  <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>

                              哎呀哎呀视频在线观看