數組與切片

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。[原文連結](https://yc90s.github.io/2017/11/20/%E6%95%B0%E7%BB%84%E4%B8%8E%E5%88%87%E7%89%87/)##數組### 定義數組是一組同類型資料的集合,它是**實值型別**,通過從0開始的下標索引訪問元素值。初始化後**數組長度是固定的**,無法修改其長度。當作為方法的入參傳入時將複製一份數組而不是引用同一指標。數組的長度也是其類型的一部分。### 初始化- 長度為5的數組,其元素值依次為:1, 2, 3, 4, 5```[5]int{1, 2, 3, 4, 5}```- 長度為5的數組,其元素值依次為:1, 2, 0, 0, 0. 在初始化時沒有指定初值的元素將會賦值為其元素類型的預設值,int是0,string是““```[5]int{1, 2}```- 長度為5的數組,其長度是根據初始化時指定的元素個數決定的```[...]int{1, 2, 3, 4, 5}```- 長度為5的數組,其元素值依次為:0, 0, 1, 2, 3. 在初始化時指定了2, 3, 4索引中對應的值:1, 2, 3```[5]int{2:1, 3:2, 4:3}```- 長度為5的數組,其元素值為:0, 0, 1, 0, 3. 由於指定了最大索引4對應的值為3, 根據初始化的元素個數確定其長度為5```[...]int{2:1, 4:3}```## 切片### 定義切片基於數組構建,但是提供更強的功能。切片的儲存結構依次是底層數組的指標、切片長度、切片容量、切片資料。切片長度是指已經被賦過值的最大下標+1, 可通過len()擷取。容量是指切片目前可容納的最多元素個數,可通過cap()擷取。**切片是參考型別**,而且**切片的長度和容量可以修改**,當切片的容量發生變化時,可能會重新分配記憶體,**使得切片和原底層數組的關聯斷開**### 初始化- 直接初始化,[]表示是切片類型,初始化值依次是1, 2, 3. 其cap=len=3```s := []int{1, 2, 3}```- 通過數組或其它切片初始化,是其的引用```s := arr[startIndex:endIndex]```- 通過make()初始化,可指定len和cap```s := make([]int, len, cap)```切片重新分配記憶體,導致切片和原底層數組關聯斷開的情況需要特殊注意,考慮如下代碼:```arr1 := [3]int{1, 2, 3}arr2 := [3]int{1, 2, 3}sli1 := arr1[:1]sli2 := arr2[:1]sli1[0] = 0sli2[0] = 0sli1 = append(sli1, 5)sli2 = append(sli2, 5, 5, 5)fmt.Println("arr1: ", arr1)fmt.Println("arr2: ", arr2)fmt.Println("sli1: ", sli1)fmt.Println("sli2: ", sli2)```執行後的輸出結果是> arr1: [0 5 3]> arr2: [0 2 3]> sli1: [0 5]> sli2: [0 5 5 5]對切片sli1的append操作實際並沒有重新分配記憶體,它還是原數組的引用,所以對sli1的append操作仍而應用到了數組arr1上;而對切片sli2的append操作,重新分配了記憶體,使得它和原數組的關聯斷開了,所以對sli2的append操作並沒有影響到數組arr2## 數組與切片區別### 數組長度不可變,切片長度和容量都可變數組的長度在初始化時就會確定下來,而切片的長度可以動態變化### 數組是實值型別,而切片是參考型別用一段代碼說明一下```func testArr(arg [3]int) {arg[0] = 0fmt.Println("testArr: ", arg)}func testSli(arg []int) {if len(arg) == 0 {arg = append(arg, 0)} else {arg[0] = 0}fmt.Println("testSli: ", arg)}func main() {arr := [3]int{1, 2, 3}fmt.Println("before testArr(): ", arr)testArr(arr)fmt.Println("after testArr(): ", arr)sli := arr[:]fmt.Println("befor testSli(): ", sli)testSli(sli)fmt.Println("after testSli(): ", sli)}```執行後程式輸出> before testArr(): [1 2 3]> testArr: [0 2 3]> after testArr(): [1 2 3]> befor testSli(): [1 2 3]> testSli: [0 2 3]> after testSli(): [0 2 3]testArr()函數對傳進去的arr參數的修改,並沒有對arr變數生效,而testSli()函數對sli變數的修改寫回到了sli變數223 次點擊  

聯繫我們

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