學習Golang語言(6):類型--切片

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

學習Golang語言(1): Hello World

學習Golang語言(2): 變數

學習Golang語言(3):類型--布爾型和數實值型別

學習Golang語言(4):類型--字串

學習Golang語言(5):類型--數組

學習Golang語言(6):類型--切片

在很多應用情境中,數組不能夠滿足我們的需求。在初始定義數組時,我們並不知道數組所需的長度。因此,我們需要一個大小可以動態變化的數組(動態數組)

在Go語言中,這種“動態數組”成為slice(切片)。

但是實際上slice並不是真正意義上的動態數組,而是一個參考型別。slice總是指向一個底層array,slice的聲明可以像array一樣。但是它不需要聲明長度。slice的長度是可變的。

嚴格來講,slice有兩個屬性容量(capacity)和長度(length),其中容量>=長度。

切片(slice)的聲明

切片可以通過以下方式建立。

1、先聲明一個變數是切片,再使用內建函數make去初始化這個切片。

    

這裡首先使用make函數定義切片slice1,這個時候slice1的容量=5;長度=5;然後使用make函數定義切片slice2,這個時候slice2的容量=10,長度=5;

因此可以看出使用make定義切片有兩種方式,

  • 只指定長度,這個時候切片長度和容量相同;

  • 同時指定切片的長度和容量。

--------------------注意--------------------

1、在容量大於長度時候,賦值仍需要注意最大的索引仍然是len(slice)-1,否則會報索引超出邊界的錯誤。

2、使用:=符號在聲明一個切片同時初始化資料,如下所示。

slice := []byte{'a','b','c','d','e'}

3、切片可以從數組或者一個已經存在的slice中再次聲明。切片通過array[i:j]來擷取數組index從i到j之間的元素。其中i是開始的位置,j是借宿的位置。但是不包含array[j],長度為j-i。

---------------------------------------------

此外:數組聲明時候方括弧內需要寫明數組的長度或者使用(...)符號自動計算長度。而切片聲明時,方括弧內沒有任何字元。

切片還有一些簡便的操作

  • 切片預設開始位置為0,slice[:n]等價於slice[0:n];

  • 切片的第二個序列預設是數組的長度,slice[n:]等價於slice[n:len(slice)];

  • 如果從一個數組裡面直接擷取切片,可以這樣slice[:],因為預設第一序列為0,第二個序列為len(slice),因此slice[:]等價於slice[0:len(slice)]。

例如:

輸出結果:


由於切片是參考型別,因此當引用改變其中元素的值時候,其他的所有引用都會改變該值。例如:

輸出結果



當我們把slice1[3]修改為100時候,slice2[0]也變為100.

---------------------------------------------

從概念上看,切片像是一個結構體,包含了三個元素:

  • 一個指向數組中切片指定的開始位置;

  • 長度,即切片的長度,通過內建函數len獲得;

  • 最大長度,即切片的最大容量,通過內建函數cap獲得。

---------------------------------------------

切片的重要特徵:長度可變,可以通過以下例子瞭解。

append追加元素

輸出結果


這裡我們初始化slice為容量=8;長度=4的切片。然後為前四個元素賦值並輸出結果。再者使用Go的內建函數append為slice追加6個元素。

這個時候查看slice的容量=16和長度=10以及切片元素。發現slice的長度確實變化。

--------------------注意--------------------

append進行追加元素時

  • 如果新的切片長度小於容量則不會改變容量。

  • 如果新的切片長度將超過容量,Go會自動重新為切片分配容量。容量大小為原先的兩倍。

上述例子看出:容量從原先的8=>16.

---------------------------------------------

上面介紹了使用append函數給切片增加元素,現在再來介紹一個copy函數:用來從一個切片拷貝元素到另一個切片。

copy複製元素

輸出結果


在上面的例子中,我們將slice1的元素拷貝到slice2,因為slice2的長度為5,因此最多拷貝5個元素。

--------------------總結--------------------

數組聲明時候方括弧內需要寫明數組的長度或者使用(...)符號自動計算長度。而切片聲明時,方括弧內沒有任何字元。

因為數組長度固定,而切片長度可變。

---------------------------------------------

歡迎關注碼術!一起學習Golang語言。


相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.