切片是數(shù)組的抽象。切片使用數(shù)組作為基本結構。片包含三個組件:容量、長度和指向基本數(shù)組的指針。
通過使用 append 或 copy 函數(shù)可以增加切片的容量。 append 函數(shù)可以為數(shù)組的末尾增加值,并在需要時增加容量。
s :=[]string{}
for i:=0;i<10;i++ {
s = append(s,"i")
t.Log(len(s),cap(s))
}
123456
slice_test.go:25: 1 1
slice_test.go:25: 2 2
slice_test.go:25: 3 4
slice_test.go:25: 4 4
slice_test.go:25: 5 8
slice_test.go:25: 6 8
slice_test.go:25: 7 8
slice_test.go:25: 8 8
slice_test.go:25: 9 16
slice_test.go:25: 10 16
12345678910
當前儲存空間存不下數(shù)據(jù)時,空間會以之前的空間數(shù)*2
比如:
numbers := make([]int,5,10)
numbers = append(numbers, 1,2,3,4,5)
t.Log(numbers,cap(numbers))
123
定義 numbers 的數(shù)組長度為5 ,空間給他10,并追加數(shù)據(jù)到切片。
slice_test.go:11: [0 0 0 0 0 1 2 3 4 5] 10
1
空間為10, 當我們再添加一個數(shù)據(jù)到切片時候,空間是多少了呢?
numbers := make([]int,5,10)
numbers = append(numbers, 1,2,3,4,5,6)
t.Log(numbers,cap(numbers))
123
slice_test.go:11: [0 0 0 0 0 1 2 3 4 5 6] 20
1
得到數(shù)據(jù)為20,和我們設想的一樣。
注意
切片中的數(shù)據(jù)是共用內(nèi)存,也就是我們選區(qū)切片區(qū)間的某一個值,并且在這個小對象中進行數(shù)據(jù)的修改,會影響整個切片的值,在開發(fā)當中非常要注意這種。
舉個例子:
numbers := make([]int,5,10)
numbers = append(numbers, 1,2,3,4,5)
t.Log(numbers,cap(numbers))
first := numbers[5:7]
second := numbers[6:8]
t.Log(first,len(first),cap(first))
t.Log(second,len(second),cap(second))
second[0] = 9
t.Log(first,len(first),cap(first))
t.Log(second,len(second),cap(second))
t.Log(numbers)
12345678910111213
取了一個first 和second 這兩個數(shù)據(jù)重合的數(shù)據(jù)是2.
打印一下:
slice_test.go:11: [0 0 0 0 0 1 2 3 4 5] 10
slice_test.go:15: [1 2] 2 5
slice_test.go:16: [2 3] 2 4
slice_test.go:19: [1 9] 2 5
slice_test.go:20: [9 3] 2 4
slice_test.go:21: [0 0 0 0 0 1 9 3 4 5]
123456
雖然在second 中修改了數(shù)據(jù),但是影響到了大對象numbers 的數(shù)據(jù),還有一個要注意的是,first 小對象,他的內(nèi)存分配是5,second 的空間是4,這是為啥呢?原來,這樣取的小對象切片,的空間是這個切片加上大對象末尾的值
開發(fā)中如果修改了其中的一個變量,但是又不想影響大對象,這個時候會傻掉。
那如何去獲取一個和numbers 一樣的數(shù)據(jù),但是又不會影響numbers呢?
我們copy一份numbers
number2 := make([]int, len(numbers))
copy(number2, numbers)
t.Log(number2,cap(numbers),cap(number2))
number2[0] = 9
t.Log(number2,numbers,cap(numbers),cap(number2))
12345678
輸出一下結果:
slice_test.go:11: [0 0 0 0 0 1 2 3 4 5] 10
slice_test.go:15: [1 2] 2 5
slice_test.go:16: [2 3] 2 4
slice_test.go:19: [1 9] 2 5
slice_test.go:20: [9 3] 2 4
slice_test.go:21: [0 0 0 0 0 1 9 3 4 5]
slice_test.go:25: [0 0 0 0 0 1 9 3 4 5] 10 10
slice_test.go:29: [9 0 0 0 0 1 9 3 4 5] [0 0 0 0 0 1 9 3 4 5]10 10
12345678
好,不懂在座的各位看懂了沒有。沒有影響的,通過copy 切片再去修改切片的值,是不會印象原切片的。
關于切片的知識,還遠遠不止這些,后續(xù)遇到問題,再補充吧,歡迎關注
1.《10內(nèi)存如何分配?終于找到答案了Go 切片內(nèi)存分配》援引自互聯(lián)網(wǎng),旨在傳遞更多網(wǎng)絡信息知識,僅代表作者本人觀點,與本網(wǎng)站無關,侵刪請聯(lián)系頁腳下方聯(lián)系方式。
2.《10內(nèi)存如何分配?終于找到答案了Go 切片內(nèi)存分配》僅供讀者參考,本網(wǎng)站未對該內(nèi)容進行證實,對其原創(chuàng)性、真實性、完整性、及時性不作任何保證。
3.文章轉(zhuǎn)載時請保留本站內(nèi)容來源地址,http://f99ss.com/gl/2143482.html