<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之旅 廣告
                [TOC] ### 實現 * 切片是基于數組實現的,它的底層是數組,它自己本身非常小,可以理解為對底層數組的抽象。 * 因為基于數組實現,所以它的底層的內存是連續分配的,效率非常高,還可以通過索引獲得數據,可以迭代以及垃圾回收優化。 * 切片本身并不是動態數組或者數組指針。它內部實現的數據結構通過指針引用底層數組,設定相關屬性將數據讀寫操作限定在指定的區域內。 * 切片本身是一個只讀對象,其工作機制類似數組指針的一種封裝。 ### 結構 切片對象非常小,是因為它是只有3個字段的數據結構:所以即使數據再多,大小也是固定的 * 指向底層數組的指針 * 切片的長度 * 切片的容量 ![](https://img.kancloud.cn/01/6c/016c6e325510b0a8cfc6a7d3b6ddb8fb_881x280.png) ### 擴容機制 * 首先判斷,如果新申請容量大于 2 倍的舊容量,最終容量就是新申請的容量。 * 否則判斷,如果舊切片的長度小于 1024,則最終容量就是舊容量的兩倍。 * 否則判斷,如果舊切片長度大于等于 1024,則最終容量從舊容量開始循環增加原來的 1/4 , 直到最終容量大于等于新申請的容量。 * 如果最終容量計算值溢出,則最終容量就是新申請容量。 (對于 append 向 slice 添加元素時,假如 slice 容量夠用,則追加新元素進去,slice.len++,返回原來的 slice。當原容量不夠,則 slice 先擴容,擴容之后 slice 得到新的 slice,將元素追加進新的 slice,slice.len++,返回新的 slice。) 情況一:原數組還有容量可以擴容(實際容量沒有填充完),這種情況下,擴容以后的數組還是指向原來的數組,對一個切片的操作可能影響多個指針指向相同地址的Slice。 情況二:原來數組的容量已經達到了最大值,再想擴容, Go 默認會先開一片內存區域,把原來的值拷貝過來,然后再執行 append() 操作。這種情況絲毫不影響原數組。 要復制一個Slice,最好使用Copy函數。 ### eg 再次強調 `切片的本質就是對底層數組的封裝`,它包含了三個信息:底層數組的指針、切片的長度(len)和切片的容量(cap)。 eg:現在有一個數組`a := [8]int{0, 1, 2, 3, 4, 5, 6, 7}`,切片`s1 := a[:5]`,相應示意圖如下。 ![](https://img.kancloud.cn/f9/6b/f96b82a5e7e400d9de90022d1fab0fad_1280x567.png) 切片`s2 := a[3:6]`,相應示意圖如下: ![](https://img.kancloud.cn/86/1b/861b4ef69eea429996c366c1176e9fe3_1278x536.png) ### 判斷切片是否為空 要檢查切片是否為空,要用`len(s) == 0`來判斷,而不應該使用`s == nil`來判斷。
                  <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>

                              哎呀哎呀视频在线观看