array是固定長度的陣列, slice是對array的擴充套件,本質上是基於陣列實現的,主要特點是定義完乙個slice變數之後,不需要為它的容量而擔心。
array與slice的差別:
(1)array是固定長度,slice是可變長度
(2)array是值型別,slice是引用型別
slice 結構
type slice struct
切片的零值為nil。 對於nil,len和cap函式都將返回0,可以宣告切片變數,然後在迴圈中追加它:
// filter returns a new slice holding only// the elements of s that satisfy fn()
func filter(s int, fn func(int) bool) int
}return p
}
slice 擴容
s := int效能選擇
注意點如果你理解了上面內容,那下面這段**的輸出結果你就不意外了
s := byte
s1 := s[2:3] s1[0] = 100
fmt.printf("s:%+v\n", s)
// s:[1 23 100 5 67 7]
沒錯,切片s 第三位的值4被替換為了100,這是因為 切片s1 的底層array指標指向 切片s 的第三位,因此操作s1會影響切片s
如前所述,重新切分切片不會複製底層陣列。 完整陣列將保留在記憶體中,直到不再引用它為止。 偶爾這會導致程式在只需要一小部分資料時將所有資料儲存在記憶體中。
例如,此finddigits函式將檔案載入到記憶體中,並在其中搜尋第一組連續數字數字,並將它們作為新切片返回。
var digitregexp = regexp.mustcompile("[0-9]+")func finddigits(filename string) byte
此**的行為與廣告一樣,但返回的 byte 指向包含整個檔案的陣列。 由於切片引用原始陣列,只要切片保持在垃圾收集器周圍就不能釋放陣列; 檔案中幾個有用的位元組將整個內容儲存在記憶體中。
要解決此問題,可以在返回之前將有趣資料複製到新切片:
func copydigits(filename string) byte
golang學習筆記 slice
go 語言中的slice型別可以理解為是陣列array型別的描述符,包含了三個因素 指向底層陣列的指標 slice目前使用到的底層陣列的元素個數,即長度 底層陣列的最大長度,即容量 因此當我們定義乙個切片變數,s make int,5,10 即為指向了乙個最大長度為10的底層陣列,目前切片s使用到的...
golang筆記 Slice切片
sliceslice代表變長的序列,序列中每個元素都有相同的型別。語法和陣列很像,只是沒有固定長度。引用型別 動態陣列 從概念上來說,slice像乙個結構體,這個結構體包含了三個元素 乙個指標,指向陣列中slice指定的開始位置 長度,即slice的長度 最大長度,也就是slice開始位置到陣列的最...
golang學習(九) 切片(slice)
在go 語言中,陣列是值型別,長度是固定的 而切片是引用型別,長度可動態增長。切片的內部結構包括位址 大小和容量。特性 1.當省略開始位置時,表示從連續區域開頭到結束位置。2.當省略結束位置時,表示從開始位置到整個連續區域結束位置。3.兩者都省略時,與切片本身等效。基本格式如下 slice 開始位置...