切片
-
概念
- 與陣列類似,也叫做變長陣列或動態陣列
- 是參考型別,因為它指向一個底層的陣列
-
語法
-
定義切片
var slicename []type //不需要說明切片的長度 var slicename = []int{1,2,3} //直接初始化使用make創建切片
func make(Type, size ...IntegerType) Type 1.內建函式make分配并初始化一個型別為切片、映射、或通道的物件 2.第一個實參為型別 3.第二個引數為長度,實際存盤元素的數量,只有在長度的范圍內才會初始化零值 4.第三個引數為容量,容量是指最多能存盤多少個資料 5.長度必須<=容量 6.通過下標只能讀寫長度范圍內的資料 7.只能通過append向切片追加資料 var silename = make([]int,3,5)func append(slice []Type, elems ...Type) []Type 1.內建函式append將元素追加到切片的末尾, 2.若它有足夠的容量,就在末尾追加資料, 3.否則,就會分配一個新的基本陣列(成倍數的擴充容量,) append可以將一個切片追加到另一個切片里,但是不能使用append(slice1,slice2)的形式,因為slice2是個切片,append函式要求只能是type元素,所以合法的寫法是append(slice1,slice2...) func append(slice []Type,otherSlice... []Type) []Type從已有陣列上直接創建切片
//array直接就是slice的底層陣列 array := [...]int{1,2,3} slice := array[start:end] //左閉右開, array[start]~array[end-1] slice := array[start:] //array[start]~最后一個元素 slice := array[:end] //第一個元素~array[end-1] slice := array[:] //全部的array元素 切片長度: 切片對應陣列片段的長度 切片容量: 切片第一個元素在陣列中的起始位置到陣列最后一個元素的長度 -
遍歷切片
for i := 0 ; i < len(slice) ;i++ {} for index,value := range slice {}
-
-
記憶體分析
- 切片是參考型別的資料,也就是資料里存盤的記憶體地址
- slice創建的程序
- 先創建底層陣列
- 把陣列地址賦值給切片變數
- 因為slice是參考型別,存盤的陣列地址,所以可以直接使用%p占位符列印
- 切片的地址也就是參考的陣列的第一個切片元素的地址
- 每一個切片參考一個底層陣列
- 切片本身不存盤任何資料,都是底層陣列存盤資料,所以修改切片也就是修改這個陣列中的資料
- 當向切片添加資料時,如果沒有超過容量就直接添加,如果超過容量就自動創建一個擴容底層陣列,
擴容的規則是:如果擴容到2倍cap滿足就擴容到2倍,否則就擴容到2*cap< len < 最小的2n - 切片一旦擴容,就重新指向一個新的底層陣列
-
修改底層陣列
- 因為所有的切片變數指向同一個底層陣列,所以修改底層陣列資料,所有的切片都能看到
- 同樣道理,通過切片修改元素,底層陣列和其他指向同一底層陣列的切片,也都能看到
- 通過append修改切片,實質也是在切片的底層陣列指定位置追加或覆寫資料,在不擴容的情況下,底層陣列或其他切片變數也能看到;如果發生了擴容,執行了append函式的切片更換了底層陣列,舊底層陣列和其他切片不會看到追加資料
-
資料型別小結
按照型別來分:
? 基本型別:int,float ,string ,bool
? 復合型別:array, slice ,map , struct ,pointer , function, chan
按照特點來分:
? 值型別:int ,float,string,bool,array
? 傳遞的是資料的副本
? 參考型別:Slice
? 傳遞地址,多個變數指向同一塊記憶體地址

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/38570.html
標籤:Go
上一篇:go實作java虛擬機02
