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