數組
//初始化方式1
var a1 = [3]bool{true, false, true}
//初始化方式2,根據值確定長度
a2 := [...]int{1, 23, 4, 5, 6}
//初始化方式3,根據索引初始化
a3 := [5]int{0: 1, 4: 2}
fmt.Println(a1, a2, a3)
切片
//1.切片的定義
var s1 []int
//2.切片的初始化,沒有初始化的時候值爲nil
s1 = []int{1, 3, 4}
//3.長度和容量
fmt.Println(len(s1),cap(s1))
//使用make創建切片,類型,長度,容量.如果不寫容量默認與長度相等
s1:=make([]int,5,6)
fmt.Println(s1)
//使用make創建切片,類型,長度,容量.如果不寫容量默認與長度相等
s1:=make([]int,5,6)
//調用append的函數必須用原來的變量接收
s1 = append(s1,1)
fmt.Println(s1)
注意:
- 切片指向了一個底層數組
- 切片的長度就是它元素的個數
- 切片的容量是底層數組從切片的第一個元素到最後一個元素的數量
- 切片之間是不能比較的
- 一個nil值的切片並沒有底層數組
- 判斷切片是否是空的要用len
切片的本質
切片就是一個框,框住了一塊連續的內存。切片屬於引用類型,真正的數據都是保存在底層數組裏面的。
擴容原理
- 首先判斷,如果新申請容量(cap)大於2倍的舊容量(old.cap),最終容量(newcap)就是新申請的容量(cap)。
- 否則判斷,如果舊切片的長度小於1024,則最終容量(newcap)就是舊容量(old.cap)的兩倍,即(newcap=doublecap),
- 否則判斷,如果舊切片長度大於等於1024,則最終容量(newcap)從舊容量(old.cap)開始循環增加原來的1/4,即(newcap=old.cap,for {newcap += newcap/4})直到最終容量(newcap)大於等於新申請的容量(cap),即(newcap >= cap)
如果最終容量(cap)計算值溢出,則最終容量(cap)就是新申請容量(cap)。
指針
取地址&,根據地址取值*