2017-04-08 44 views
7

我的問題是關於切片長度和容量。我在這裏學習Go:https://tour.golang.org/moretypes/11降低切片容量

(我的問題被標記爲的this可能重複的;然而,這不是的情況下我的問題是特別關於切斷的切片的前幾個元素與該影響)

s = s[:4]s = s[:0]不行時,爲什麼行s = s[2:]減少了容量?我看到的唯一區別是s = s[2:]的冒號前面有一個數字,而其他兩行冒號後面有一個數字。

有什麼辦法可以恢復我們用s = s[2:]切斷的前兩個元素?

package main 

import "fmt" 

func main() { 
    s := []int{2, 3, 5, 7, 11, 13} 
    printSlice(s) 

    // Slice the slice to give it zero length. 
    s = s[:0] 
    printSlice(s) 

    // Extend its length. 
    s = s[:4] 
    printSlice(s) 

    // Drop its first two values. 
    s = s[2:] 
    printSlice(s) 
} 

func printSlice(s []int) { 
    fmt.Printf("len=%d cap=%d %v\n", len(s), cap(s), s) 
} 

單擊運行按鈕後,我們得到以下內容。

len=6 cap=6 [2 3 5 7 11 13] 
len=0 cap=6 [] 
len=4 cap=6 [2 3 5 7] 
len=2 cap=4 [5 7] 
+0

的可能的複製(HTTP:// stackoverflow.com/questions/36683911/go-slices-capacity-length)(回答:「容量將是直到最後一個bac的第一個元素國王陣列「) – kennytm

+0

可能的重複[是否沒有真正的方法來縮小切片?這是一個問題嗎?](http://stackoverflow.com/questions/16748330/does-go-have-no-real-way-to-shrink-a-slice-is-that-an-issue) – Flimzy

回答

8

您可以閱讀更多關於切片here。但我認爲這段話回答你的問題:

切片不復制切片的數據。它創建一個指向原始數組的新切片值。這使得切片操作與操作數組索引一樣高效。因此,修改重新切片的元素(而不是切片本身)會修改原始切片的元素。

因此,如果將其分配給同一變量,則無法恢復切片數據。

容量減少的原因是通過刪除前2個元素來更改指向新切片的指針(切片由指向第一個元素的指針引用)。

如何切片在存儲器中表示:[?轉到切片 - 容量/長度] def

make([]byte, 5) 

memory vis

s = s[2:4] 

slice cap decrease

+0

謝謝,亞歷克斯。該鏈接非常有幫助。 我沒有完全按照你在這裏發佈的圖表,直到我查看了鏈接上方的圖表。 (我不明白,藍色,紫色和粉紅色方塊代表片內部。) – Pizzas

+0

我已經更新了答案,使其更易於理解。 –