<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] > [參考](https://github.com/geektutu/high-performance-go/blob/master/charpter-2/hpg-slice.md) ## 數組 - 數組是值傳遞,與C的數組不同,C中指針傳遞,指向第一個元素 - Go 中為了避免復制數組,一般會傳遞指向數組的指針 ``` func square(arr *[3]int) { for i, num := range *arr { (*arr)[i] = num * num } } func TestArrayPointer(t *testing.T) { a := [...]int{1, 2, 3} square(&a) fmt.Println(a) // [1 4 9] if a[1] != 4 && a[2] != 9 { t.Fatal("failed") } } ``` ## 切片 - 切片操作并不復制切片指向的元素,創建一個新的切片會復用原來切片的底層數組,因此切片操作是非常高效的 - 切片本質是一個數組片段的描述,包括了數組的指針,這個片段的長度和容量(不改變內存分配情況下的最大長度) ``` struct { ptr *[]T len int cap int } ``` ![](https://geektutu.com/post/hpg-slice/slice.jpg) ``` nums := make([]int, 0, 8) nums = append(nums, 1, 2, 3, 4, 5) nums2 := nums[2:4] printLenCap(nums) // len: 5, cap: 8 [1 2 3 4 5] printLenCap(nums2) // len: 2, cap: 6 [3 4] nums2 = append(nums2, 50, 60) printLenCap(nums) // len: 5, cap: 8 [1 2 3 4 50] printLenCap(nums2) // len: 4, cap: 6 [3 4 50 60] ``` ## 性能陷阱 ### 大量內存得不到釋放 ``` func lastNumsBySlice(origin []int) []int { return origin[len(origin)-2:] } func lastNumsByCopy(origin []int) []int { result := make([]int, 2) copy(result, origin[len(origin)-2:]) return result } ``` ``` slice_test1.go 100.14 MB slice_test2.go 3.14 MB ``` 1. 申請的 100 個 1 MB 大小的內存沒有被回收。因為切片雖然只使用了最后 2 個元素,但是因為與原來 1M 的切片引用了相同的底層數組,底層數組得不到釋放,因此,最終 100 MB 的內存始終得不到釋放 2. 而`lastNumsByCopy`僅消耗了 3.14 MB 的內存。這是因為,通過`copy`,指向了一個新的底層數組,當 origin 不再被引用后,內存會被垃圾回收(garbage collector, GC)
                  <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>

                              哎呀哎呀视频在线观看