陣列
- 陣列在go語言中為值型別
- 陣列之間可以用= =或!=比較,但是陣列長度也是型別的一部分,因此不同長度的陣列為不同的型別,如下,這是兩個不同型別,因為陣列長度不一樣,不能用==或!=比較= =
- 下面ap和at陣列是不同型別
ap:=[5]int{3:2}//下標3的值賦值為2
at:=[6]int{}
- 陣列遍歷
//陣列遍歷,i是陣列當前下標,p是當前下標對應的值,i可以用_下劃線代替,表示忽略
as := [3]int{1, 2, 3}
for i, p := range as {
f.Println(i, "---", p)
pa[i] = &as[i]
}
//還可以常用的遍歷迴圈
le:=len(as)
for i:=0;i<le;i++{
f.Println(as[i])
}
- 陣列指標和指標陣列的區別,跟c++沒啥區別
//指標陣列
as := [3]int{1, 2, 3}
var pa [3]*int
for i, p := range as {
f.Println(i, "---", p)
pa[i] = &as[i]
}
//陣列指標
var pa2 *[3]int
pa2 = &as
f.Println(*pa2)
切片 slice
切片不是陣列,他是指向底層的陣列
建立一般用make方法,第一個引數是指向的陣列型別,第二個是存放元素的個數,第三個是存放容量,如果存放的個數超過容量,那麼他就會從分配記憶體地址(容量在原來的基礎上*2),len方法獲取長度,cap獲取容量
如果是簡潔宣告,不宣告陣列長度就是切片,譬如
s:=[] int{}//切片
a:=[10] int{1,2,3,4,5,6,7,8,9,10}//陣列
c:=a[3,5]//切片c獲取陣列a下標3到5位元素值,包括3不包括5下標
d:=a[3:]//下標3到a陣列的長度
切片新增元素,方法append
s := make([] int, 5, 10) //第一個參數列示儲存型別,第二個表示儲存陣列長度,第三個是指如果陣列最大長度,如果長度超出10,他就會翻倍,分配一個長度20的記憶體塊,如果不設定,最大容量就是陣列長度
f.Println(len(s), cap(s)) //獲取切片長度和容量
s = append(s, 1, 2, 3, 4, 5, 6)//從尾部新增元素
s=append(s); //可以將一個切片新增到另一個切片中
for _, al := range s {
f.Println(al)
}
//列印結果0 0 0 0 1 2 3 4 5 6
//為什麼列印是10個元素呢,因為他的容量是10,所以列印10個元素
reslice 切片重組
- 索引以slice為準,索引不可以超過slice切片的容量,越界不會導致底層陣列的從新分配,而是報錯
a:=[10] int{1,2,3,4,5,6,7,8,9,10}//陣列
s:=a[3,5]//切片 輸出為[4 5]
rs:=s[0,1] //reslice 輸出為[4],下標從切片s的0開始計算,s的下標0對應的值為4
- 如果rs:=s[0,10]則報錯,因為切片s的最大下標為7,即它的容量是7,容量求值方法為:cap(s)
Map集合,跟其他語言一樣,是key-value形式
m := make(map[int]string)
//m:=map[int]string{0:"0",1:"1"}還可以這樣初始化
m[0] = "first"
m[1] = "second"
fm.Println("map is:", m, "--m[0] is:", m[0])
delete(m, 0)
fm.Println("m[0] value is:", m)
- 複雜點的map,如map<key,map<key,value>>形式的
ms := make(map[int]map[int]string) //只是初始化最外層的map
mv, ok := ms[0][0] //判斷裡面的map有沒有初始化,如果沒有,返回false
if !ok {
ms[0] = make(map[int]string) //現在初始化value的map
}
ms[0][0] = "賦值成功"
fm.Println("ms is:", ms, " mv is:", mv)
- 還有陣列map,[map<key,value>,map<key,value>]形式的
ma:=make([]map[int]string,6)//設定陣列容量6
for k:=range ma{
ma[k]=make(map[int]string,1//設定map容量1
ma[k][0]="fm"
}
fm.Println("ma is:",ma)
for k, _ := range ma {//遍歷陣列map
for k1, v1 := range ma[k] {
fm.Println("k1 is:", k1, " v1 is:", v1)
}
}
- over
作者:Link_Biao
連結:www.jianshu.com/p/ed609a1d83a4
本作品採用《CC 協議》,轉載必須註明作者和本文連結