GO語言基礎教程:array,slice,map

來源:互聯網
上載者:User

標籤:go

    這節課我們來講解數組,切片和map,或許您是從其他語言轉到GO語言這邊的,那麼在其他語言的影響下您可能會不太適應GO語言的數組,因為GO語言把數組給拆分成了array,slice和map,接下來的時間讓我們一起研究一下這三者的差異以及用法.首先我們說一下array的部份:
    1.數組的長度屬於數組的一部份,我們看下邊的例子
        a:=[1]int{}和b:=[2]int{}
      a和b都是數組,但是他們的長度不同,在GO語言中會認為是不同的兩種類型,既然是不同的類型,那麼他們就不能進行比較或直接賦值的操作.其實這並不難理解,因為GO語言是類型安全的語言,跨越類型的賦值需要顯示的改變數據類型才行.
    2.在GO語言中數組屬於值類型,而非引用類型,如果要取得數組的指針只需要這麼做即可.
        a:=[1]int{};p:=&a
      通過上邊的語句就可以取得數組的指針,並把指針賦值給了變量p
    3.array的鍵名只能用整型或字元型,並且下標從零開始

    array的定義格式為:
    var 數組變量名 = [長度]類型{}

    接下來讓我們來看這段代碼:
  
    a1:=[2]int{}                    //聲明一個數組,不賦予初始值,所以數組中每一個元素的值都是int的初值    a2:=[2]int{1,2}                 //聲明一個數組,並賦予初始值    a3:=[2]int{1:2}                 //聲明一個數組,給[1]賦初始值    fmt.Println(a1);    fmt.Println(a2);    fmt.Println(a3);    p1:=&a1                         //取得a1這個數組的指針    fmt.Println(p1);    b:=[3]string{"aa","bb","cc"}    //聲明一個string類型的數組,並賦予初始值    c:=[...]string{"aa","bb","cc"}  //聲明一個數組,不設定長度,用三個點告訴GO語言自己計算數組長度    fmt.Println(b);    fmt.Println(c);    fmt.Println(b==c);              //比較兩個數組是否相同    c[1]="BB"                       //修改[1]的值    fmt.Println(b==c);              //比較兩個數組是否相同    fmt.Println(cap(c));            //取得數組容量    fmt.Println(len(c));            //取得數組長度    //array的鍵名必須是數字或字節    d:=[...]int{96:3,'a':4}         //用字元作為鍵名,因為每個字元實際上是對應了一個int型的序號,所以其實鍵名還是int型的    fmt.Println(d);    e:=[2][3]int{{1,1,1},{2,2,2}}   //聲明一個二維數組    fmt.Println(e);    f:=[...][3]int{{1,1,1},{2,2,2}} //聲明一個多維數組,維數讓GO語言來計算    fmt.Println(f);    p:=new([4]int)                    //這是另外一種聲明數組的方法,可以用new關鍵字,但是這種聲明方法會返回指向數組的指針    fmt.Println(p);



    接下來讓我們來一起看一下slice切片,切片的部份需要大家知道以下幾個要點:
    1.切片本身不是一個數組,但是他的底層指向其他的數組
    2.用切片可以達到變長數組的特性,我們知道array的長度是固定的
    3.切片是引用類型,我們知道array是值類型
    4.切片用make關鍵字建立,array用new
    5.若多個切片指向同一個數組,當這個數組的某個值被改變後,所有的切片的值也跟這邊,這就是引用類型的特性.

    建立切片的語法格式如下:
    切片名 = make([]數組名,長度,容量)

    讓我們來看一下切片的用法吧:
   
    //s=make([]int,3,5)            //這是標準的定義方式,定義切片的時候同時分配內存    //fmt.Println(s);    a:=[...]int{1,2,3,4,5,6,7,8,9,0}    fmt.Println(a);    s:=[]int{}                    //定義一個切片    fmt.Println(s);    s=a[5:]                        //讓該切片指向數組a,同時為其賦值    fmt.Println(s);    x:=a[4:9]    fmt.Println("x的值是:",x);    a[7]=99                        //改變數組的某個值    fmt.Println(s);                //列印切片,發現值也變了    fmt.Println("x的值是:",x);    //此時切片的值也被改變了    s=a[:]                        //取得所有的元素    fmt.Println(s);



    最後我們看一下map的用法,map與數組或切片不同,我們來看一下有哪些不同點
    1.map使用key-value的方式來存儲,key值不再局限於int型,可以是字串之類的值
    2.map比數組或切片慢很多,所以如果能用數組或切片的情況下儘量別用map
    3.map跟切片一樣是使用make來創建,這一點和數組的new是不同的
    4.map用delete刪除某個元素
    5.用range對map或切片進行迭代操作.

    接下來我們看一下map的基本用法:
   
    var m1 = map[string]float64{"Bell Labs": 40.68433,"Google":37.42202}    m1["new"]=1.01                    //新增鍵值對    fmt.Println("三個元素:",m1)    delete(m1,"new")    fmt.Println("兩個元素:",m1)    fmt.Println(m1);                //此時鍵["new"]已經不存在了    for k, v := range m1 {            //迭代遍歷map        fmt.Printf("m1[%s]=%f\n", k, v)    }    fmt.Printf("m1的長度是 %d \n", len(m1))    m := make(map[string]int)        //用make建立map    m["k1"] = 7    m["k2"] = 13    fmt.Println("map:", m)


    由此可見array;slice;map每個都有各自不同的用法,另外在效能上也有差異,在日常使用時建議使用array和slice,map雖然更靈活只可惜效能不夠高.


希望轉載文章的朋友能夠留一個文章出處,http://blog.csdn.net 在此感激不盡!

剛成立了一個QQ群,有興趣討論GO語言的朋友可以加入:195112

GO語言基礎教程:array,slice,map

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.