切片是數(shù)組的抽象。切片使用數(shù)組作為基本結(jié)構(gòu)。片包含三個(gè)組件:容量、長度和指向基本數(shù)組的指針。
通過使用 append 或 copy 函數(shù)可以增加切片的容量。 append 函數(shù)可以為數(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
當(dāng)前儲存空間存不下數(shù)據(jù)時(shí),空間會以之前的空間數(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, 當(dāng)我們再添加一個(gè)數(shù)據(jù)到切片時(shí)候,空間是多少了呢?
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è)想的一樣。
注意
切片中的數(shù)據(jù)是共用內(nèi)存,也就是我們選區(qū)切片區(qū)間的某一個(gè)值,并且在這個(gè)小對象中進(jìn)行數(shù)據(jù)的修改,會影響整個(gè)切片的值,在開發(fā)當(dāng)中非常要注意這種。
舉個(gè)例子:
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
取了一個(gè)first 和second 這兩個(gè)數(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ù),還有一個(gè)要注意的是,first 小對象,他的內(nèi)存分配是5,second 的空間是4,這是為啥呢?原來,這樣取的小對象切片,的空間是這個(gè)切片加上大對象末尾的值
開發(fā)中如果修改了其中的一個(gè)變量,但是又不想影響大對象,這個(gè)時(shí)候會傻掉。
那如何去獲取一個(gè)和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
輸出一下結(jié)果:
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 切片再去修改切片的值,是不會印象原切片的。
關(guān)于切片的知識,還遠(yuǎn)遠(yuǎn)不止這些,后續(xù)遇到問題,再補(bǔ)充吧,歡迎關(guān)注
1.《10內(nèi)存如何分配?我來告訴你答案Go 切片內(nèi)存分配》援引自互聯(lián)網(wǎng),旨在傳遞更多網(wǎng)絡(luò)信息知識,僅代表作者本人觀點(diǎn),與本網(wǎng)站無關(guān),侵刪請聯(lián)系頁腳下方聯(lián)系方式。
2.《10內(nèi)存如何分配?我來告訴你答案Go 切片內(nèi)存分配》僅供讀者參考,本網(wǎng)站未對該內(nèi)容進(jìn)行證實(shí),對其原創(chuàng)性、真實(shí)性、完整性、及時(shí)性不作任何保證。
3.文章轉(zhuǎn)載時(shí)請保留本站內(nèi)容來源地址,http://f99ss.com/gl/2147148.html