切片的簡介
概念
切片是一個引用類型,可以創建"字符串"切片,可以創建"整型"切片等
切片和數組的區別( !!!!重點)
- 切片和數組相似,它們都是保存相同數組類型元素的容器,但是切片的元素個數是可變的, 數組不可變
- 切片不需要明確指定元素的個數
創建切片方法
var s []int //創建int類型切片 var s []string //創建string類型切片
切片的內部實現
切片是一個很小的對象,它對底層的數組(內部是通過數組保存數據的)進行了抽象,並提供相關的操作方法;
切片是有三個字段的數據結構,這些數據結構包含Go語言需要操作底層數組的元數據
這3個字段分別是: 指向底層數組的指針、切片訪問的元素的個數(即長度)、切片允許增長到的元素個數
切片的創建和初始化(字面創建)And 對比
一、字符串類型 和 字符串類型切片 和 字符串類型數組對比
//創建 "字符串" 數據類型 myStr1 := "hahaha" fmt.Println(myStr1) fmt.Printf("%T \n",myStr1) //結果: hahaha #字符串打印結果 string #字符串 數據類型 --------------------------------------------------------- //創建 "字符串"類型的切片 myStr2 := []string{"zhangsan", "list", "wangwu"} fmt.Println(myStr2) fmt.Printf("%T \n",myStr2) //結果: [zhangsan list wangwu] #字符串類型切片打印的結果 []string #字符串類型的切片 --------------------------------------------------------- //創建"字符串"類型的數組 myStr3 := [3]string{"zhangsan","lisi","wangwu"} fmt.Println(myStr3) fmt.Printf("%T",myStr3) //結果: [zhangsan lisi wangwu] [3]string #字符串類型的數組
可以看到,字符串 數組和切片的區別就是 切片不需要聲明 長度
二、int數據類型 和 int類型切片 和 int類型的數組對比
//創建int類型的 數據類型 myInt03 := 28 fmt.Println(myInt03) fmt.Printf("%T",myInt03) //結果: 28 int #數據類型為int ------------------------------------------------------- //創建int類型的 數組 myInt01 := [3]int{1,2,3} #需要指定長度 fmt.Println(myInt01) fmt.Printf("%T \n",myInt01) //結果: [1 2 3] [3]int #是int類型的數組 ------------------------------------------------------ //創建int類型的 切片 myInt := []int{1,2,3} #不需要指定長度 fmt.Println(myInt) fmt.Printf("%T",myInt) //結果: [1 2 3] []int #打印出來的數據類型里 不帶長度標識
可以看到 int類型的數組和切片的區別就是 切片不需要聲明長度
切片的創建和使用
切片常用的操作和含義
通過make()函數聲明切片
使用Go語言內置的make()函數創建切片,此時需要傳入一個參數來指定切片的長度
// 創建一個整型切片 // 其長度和容量都是 5 個元素 slice := make([]int, 5)
此時只指定的切片的長度,那么切片的長度和容量是相等的,都是5;
也可以分別指定長度和容量
// 創建一個整型切片 // 其長度為 3 個元素,容量為 5 個元素 slice := make([]int, 3, 5)
Go語言不允許容量<長度,會報錯
二、聲明切片(普通方式)
//聲明一個空的切片,未引用任何數組,所以這個切片現在nil,意思就是切片的零 值 var s = []int fmt.Println(s == nil)
//結果: true
2.1上面的結果為什么nil?
因為切片只是對一個數組的引用,切片是不存儲任何數據的,數組是存在數組中的;
當切片需要擴容時,就會創建一個合適長度的新數組,以存儲更多數據;
當我們用var s []int創建一個切片時,它還沒有引用任何數組,所以它的值時nil
下面我們創建一個切片,並引用數組
//創建一個空int類型切片 var s []int //創建一個int類型數組 var arry = [9]int{1,2,3,4,5,6,7,8,9} //引用數組,對其進行切片,截取小標2:4-1的元素 s = arry[2:4] fmt.Println(s) //結果: [3 4]
2.2數組的值被修改, 會不會影響切片的結果
//創建一個空 int類型切片 var s []int //創建一個int類型數組 var arry = [9]int{1,2,3,4,5,6,7,8,9} //竊取數組a的2:4-1元素的值 s = arry[2:4] //對數組a的下標2:4-1元素的值進行修改. arry[2] = 33 arry[3] = 44 //打印切片s fmt.Println(s) //結果: [33 44]
#可以看到,修改完數組的值,切片獲取的值 也變了
2.3切片初始化