上一篇我們已經知道go語言的數組
今天介紹切片
切片
語法:
var 變量 []數據類型
和數組
的區別在於 長度是可變的 ,而數組的長度是固定的
因此定義切片的時候 不需要像數組那樣定義長度
如:var arr [...]int
或 var arr [3]int
len() 求切片的長度
長度很好理解 就是 有幾個元素 就是多少長度
用法:
var s1 []int
s1 = []int{1,2,3}
fmt.Println(len(s1))
cap() 求切片的容量
用法:
var s1 []int
s1 = []int{1,2,3}
fmt.Println(cap(s1))
容量
在介紹容量之前,先知曉切片
和數組
之間的關係:
首先,切片不保存具體的值,切片對應一個底層數組,
所以,切片的元素其實是底層數組的元素
那麼容量是指底層數組的容量 也就是從切片的第一個元素對應在底層數組中的位置算起直到最後一個元素,這之間的長度就是容量。
例子如下
package main
import "fmt"
func main(){
//這個作爲底層數組
arr := [...]int{1,2,3,4,5,6,7}
//打印數組的長度和容量 長度爲7 容量也是7
fmt.Println(len(arr),cap(arr))
//獲取切片 這個切片的底層是上面的數組
//切片的元素 數組的下標2的值到下標3的值 也就是 3,4
s := arr[2:4]
//打印切片的長度和容量 長度2 容量就是從3數到最後 所以爲 5
fmt.Println(len(s),cap(s))
}
切片初始化
如果一個切片定義之後,沒有進行初始化操作,那麼值是?
var s1 []int
var s2 []string
//判斷是否是nil nil就是空的意思
fmt.Println(s1 == nil)//true
fmt.Println(s2 == nil)//true
//所以要進行初始化操作
s1 = []int{1,2,3}
s2 = []string{"z","z","s"}
由數組獲取切片
因爲切片的底層是數組,所以我們可以通過數組獲取切片
語法:
s := 數組[開始:結束]
開始:初始的下標值爲0
結束:這裏是最大值是最後一個元素的下標
下面我將通過各種方式獲取切片的例子來說明這個寫法需要注意的點
記住 左閉右開
//首先定義並初始化一個數組
a1 := [...]int{1,3,5,7,9,11}
//將數組的第一個元素(下標爲0)到數組的下標爲3的元素 作爲切片的元素
s3 := a1[0:4] //左閉右開 原理是 (0)下標到(4-1)下標的所有值
fmt.Println(s3)
//獲取切片 [3 5 7 9 11]
s4 := a1[1:6]
fmt.Println(s4)
//獲取切片 [1 3 5 7]
s5 := a1[:4] //開始位置沒有寫 表示默認從下標0開始
fmt.Println(s5)
//獲取切片 [7 9 11 13]
s6 := a1[3:] //結束位置沒有寫 表示默認到最後一個
fmt.Println(s6)
//獲取切片 [1 3 5 7 9 11 13]
s7 := a1 [:]
fmt.Println(s7)
切片中獲取切片
原理和從數組中獲取切片是一樣的 具體用法如下:
//同樣 新建一個底層數組
arr := []int{1,2,3,4,5}
//生成切片
s1 := arr[:]
//切片中獲取切片
s2 := s1[1:3]
fmt.Println(s2)
關於切片的介紹先暫時到這邊
有不清楚的或者有什麼歧義的
可以的評論區留言
未完待續。。。