Golang中的slice切片
- 切片
- 切片的內部實作
- 切片的切割
- 切片的擴容
- 切片作為函式引數
- for回圈中的range
切片
切片的內部實作
- 結構
- 指向底層陣列的指標
- 長度len()
- 容量cap()
-
切片與陣列的區別
初始化陣列:var arrayName [length]type{}
陣列會默認把指定長度的值初始化為零值, -
切片的初始化
var sliceName []type
默認指標是nil,長度和容量都是0sliceName := make([]type,1,2)
使用make之后,會把切片初始化為0值,可以通過下標訪問如果使用make([]type,2),會初始化len為2,cap為2的切片,
Javaer在這里需要注意,此時如果再使用append去添加元素到切片中,默認會有2個元素是0值,
錯誤示范:
slice := make([]int,6)
for _,value := range slice1{
slice = append(slice,value)
}
// 最后的結果可能是{0,0,0,0,0,0,slice1....}
正確解法:
slice := make([]int,0,6)
for _,value := range slice1{
slice = append(slice,value)
}
// 最后的結果是{slice1....}
注意事項:
Go不允許創建cap小于len的切片
切片定義時默認不會初始化底層陣列,必須使用make初始化才可以用
把一個切片賦值給另一個切片,彼此共享資料結構
切片的切割
// 假設slice的容量是k
slice[i:j] 從i到j,長度是j-i,容量是k-i,相當于slice[i:j:k]
slice[i:] 從i到最后一個元素
slice[:j] 從0到j-1
slice[:] 從頭到尾,相當于slice復制
注意事項
將切片切成兩個切片時,共享底層陣列,修改其中一個,也會影響到另外一個
如果兩個切片資料沒有交集,則修改就不會影響到另一個
切片的擴容
-
append函式會增加切片的長度,但是不一定會增加切片的容量,取決于長度有沒有超過初始化的容量,
-
append時,如果超過了容量,會進行擴容,元素在1000以內時,都會成倍增長進行擴容,擴容后,新創建的切片跟原來切片的記憶體空間就不會共享了,修改切片元素的值,不會影響彼此的資料,
切片作為函式引數
切片是參考型別,作為函式的引數,函式內部的切片引數和外部的切片底層陣列是同一個物件,函式內部修改的切片會影響外部的引數切片值(map也是一致的參考型別),
for回圈中的range
range回圈創建了每個元素的副本,在for回圈中修改value的值,不會影響原來的值,
迭代中,使用append和delete會影響到原來的切片或者map字典,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/282354.html
標籤:區塊鏈
上一篇:Windows安裝CUDA&cuDNN&anaconda
下一篇:區塊鏈入門及非對稱加密技術
