GO 四、array , slice
Array
- 長度也是數組的一部分
- 注意指向數組指針,還是指針數組
- Array is value type 值類型
- 使用
new可以創建Array
var app [2]int
var mybox [2]string
app:=[2]int{1,1}
app:=[...]int{1,2,3,4,5}
app:=[30]int{29,1} //將第29個元素賦值1
---
a:=[...]int{99:1}
var p *[100]int=&a //會輸出&[0 0 0 0 ... 100]
p:=new([10]int) //效果同上,是指向數組的指針
fmt.Println(p) //會輸出&[0 0 0 0 0 0 0 0 0 0]
x,y=1,2
a:=[...]*int(&x,&y) //a是指向int的指針(指針數組)
fmt.Println(a) //分別輸出x,y的記憶體位置 (保存的是指針.) 0xf840036020
Slice
- 本身不是數組,而是指向底層的數組
- 可以關聯局部或全部的數組
- 引用類型 Reference Type
- 創建模式
- 創建使用
make() - 獲取底層數組生成
- 創建使用
len()取個數、cap()取容量- 多個slice 指向同一個array , 改一個會改全部.
var s1 []int //1. Declarations slice 與array相比沒有指定各數
a:=[10]int{1,2,3,4,5,6,7,8,9,0} //array,have 10
s2:=a[9]
fmt.Println(s2)// is 0
a:=[10]int{1,2,3,4,5,6,7,8,9,0} //array,have 10
s3:=a[5:] //or s3:=a[5:10]
fmt.Println(s3)// is 6 7 8 9 10
s4:=a[:5] //or s4:=a[0:5]
fmt.Println(s4)// is 1 2 3 4 5
Make.
s1:=make([]int,3,10)
//初始化3個int. (會分配10塊連續內存)
//到第11個時,會重新分配內存 --> 新的空間會變成20
//到第22個時,會再重新分配內存 --> 新的空間會變成40
圖解

Reslice
array -> slice -> new slice
array =[a,b,c,d,e,f]slice_a[2:5] // [c,d,e]slice_b :=slice_a[1:3] // [d,e]可以取超過slice的個數,即便是從slice_a切的,因為實現的是底層數組slice_b :=slice_a[3:5] //[def]
Append
- 在尾部增加元素
- 若超過長度則重新分配記憶體
s1:=make([]int,3,6)
fmt.Printf("%p\n",s1) //0xf84002c700
s1 = append(s1,1,2,3)
fmt.Printf("%v, %p\n"s1)//0xf84002c700 [0 0 0 1 2 3]
s1 = append(s1,1,2,3)
fmt.Printf("%v, %p\n"s1)//0xf84002c800 [0 0 0 1 2 3 1 2 3]
Copy
s1 :=[]int{1,2,3}
s2 :=[]int{4,5,6}
copy(s1(0:1),s2(0:1))
fmt.Printf(s2) //1,3