Golang 陣列和切片 Slice 和 Map 使用

wangchunbo發表於2020-06-04

陣列

  • 陣列在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 協議》,轉載必須註明作者和本文連結

上海PHP自學中心-免費程式設計視訊教學|
7Dn78VKKcW.jpg!large
S3d25uqwht.png!large

相關文章