GO語言學習之切片(slice)


切片的簡介

概念

切片是一個引用類型,可以創建"字符串"切片,可以創建"整型"切片等

切片和數組的區別( !!!!重點)

  1. 切片和數組相似,它們都是保存相同數組類型元素的容器,但是切片的元素個數是可變的, 數組不可變
  2. 切片不需要明確指定元素的個數

創建切片方法

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切片初始化

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM