切片 - Go 語言學習筆記

概述

切片是基於數據中連續片斷的引用,是一個引用類型。與數組相比,切片的長度能夠在運行時修改,能夠將切片看做是長度可變的動態數組。數組

切片的實現是由一個底層數組以及其上面的動態位置,尺寸來實現。由指向底層數組的指針、訪問元素的個數(即長度length)和容許增加到的元素個數(即容量capacity)組成。bash

  • 指針ptr,用於指向切片在底層數組的起始位置。
  • 尺寸len,用於記錄切片內元素數量。
  • 容量cap,當前切片最大容量,也就是底層數組的容量,能夠動態分配。

建立和初始化切片

1. make和切片字面量

使用內置函數make()建立切片:app

var slice []type = make([]type, len, cap) 也能夠簡寫: slice := make([]type, len, cap)ide

// 只指定長度,那麼切片的容量和長度相等
slice1 := make([]string, 5)    // 建立一個字符串切片,其長度和容量都是5個元素

// 分別指定長度和容量建立的切片
slice2 := make([]int, 3, 5)    // 建立一個整型切片,其長度爲3個元素,容量爲5個元素
複製代碼

使用切片字面量建立切片:

var identifier []type函數

slice1 := []string{"Red", "Blue", "Green", "Yellow", "Pink"} // 長度和容量都是5個元素的字符串切片
slice2 := []int{10, 20, 30} // 長度和容量都是3個元素的整型切片
slice3 := []string{99: ""} // 建立字符串切片,使用空字符串初始化第100個元素
複製代碼

聲明數組和聲明切片的不一樣:
// 建立有3個元素的整型數組
array := [3]int{10,20,30}

// 建立長度和容量都是3的整型切片
slice := []int{10, 20, 30}
複製代碼

若是在[]運算符裏指定了一個值,那麼建立的就是數組而不是切片。spa

2. nil 和 空切片

聲明切片後未作初始化就會默認爲 nil,長度爲 0,實例以下:指針

// 建立nil整型切片
var slice []int
複製代碼

利用初始化,經過聲明一個切片能夠建立一個空切片,實例以下:code

// 使用make建立空的整型切片
slice := make([]int, 0)

// 使用切片字面量建立空的整型切片
slice := []int{}
複製代碼

使用切片

1. 賦值和切片

使用[]操做符就能夠改變某個元素的,實例以下:索引

// 建立一個整型切片
// 其容量和長度都是5個元素
slice := []int{10, 20, 30, 40, 50}

// 改變索引爲1的元素的值
slice[1] = 25
複製代碼

使用切片建立切片ci

// 建立一個整型切片
// 其長度和容量都是5個元素
slice := []int{10, 20, 30, 40, 50}

// 建立一個新切片
// 其長度爲2個元素,容量爲4個元素
newSlice := slice[1:3]
複製代碼

以上兩個切片它們共享同一段底層數組,經過不一樣的切片會看到底層數組的不一樣部分。

2. 切片增加

使用append向切片增長元素

// 建立一個整型切片
// 其長度和容量都是5個元素
slice := []int{10, 20, 30, 40, 50}

// 建立一個新切片
// 其長度爲2個元素,容量爲4個元素
newSlice := slice[1:3]

// 使用原有的容量來分配一個新元素
// 將新元素賦值爲60
newSlice = append(newSlice, 60)
複製代碼

使用append同時增長切片的長度和容量

// 建立一個整型切片
// 其長度和容量都是4個元素
slice := []int{10, 20, 30, 40}

// 向切片追加一個新元素
// 將新元素賦值爲50
newSlice := append(slice, 50)
複製代碼

3. 迭代切片

使用 for range 迭代切片

// 建立一個整型切片
// 其長度和容量都是4個元素
slice := []int{10, 20, 30, 40}

// 迭代每個元素,並顯示其值
for index, value := rang slice {
    fmt.Printf{"Index: %d Value: %d\n", index, value}
}

OutPut: 
Index: 0  Value: 10
Index: 1  Value: 20
Index: 2  Value: 30
Index: 3  Value: 40
複製代碼

使用 for 循環迭代切片

// 建立一個整型切片
// 其長度和容量都是4個元素
slice := []int{10, 20, 30, 40}

// 從第三個元素開始迭代每一個元素
for index := 2; index < len(slice); index++ {
    fmt.Printf("Index: %d Value: %d\n", index, slice[index])
}

Output:
Index: 2 Value: 30
Index: 3 Value: 40
複製代碼
相關文章
相關標籤/搜索