這篇文章帶大家了解一下golang中可變長度的"陣列"—切片(slice),希望對大家有幫助!
golang切片(slice)
(1)切片的定義
切片(Slice)是一個擁有相同類型元素的可變長度的序列。它是基於數組類型做的一層封裝。它非常靈活,支援自動擴容。
切片是一個引用類型,它的內部結構包含位址、長度和容量。切片一般用於快速地操作一塊資料集合。 【相關推薦:Go影片教學】
建立切片跟建立陣列唯一的差異在於Type 前的「 [] 」中是否有數字,為空,則代表切片,否則則代表數組。因為切片是長度可變的
var a []string //声明一个字符串切片 var b = []int{1,2,3} //声明一个整数类型切片并初始化 var c = []bool{false,true} //声明一个bool类型并且初始化
其實在實際情況下,很多時候都是理解成:切片是數組的一部分
num:=[3]int{0,1,2} //:前后表示数组内部的索引 sc1:=num[:] //获取数组的全部 sc2:=num[0:2] //左闭右开,取到的是[0,1] sc3:=num[1:] //取到的是[2] sc4:=num[:1] //取到的是[0]
(2)使用make函數創造切片
這裡就開始對應上前面的說法,切片的容量的可變的,用make函數就可以實現,切片的本質就是對底層數組的封裝,它包含了三資訊:底層數組的指標、切片的長度(len)和切片的容量(cap)。
// make([]T, size, cap) sc=make([]int,2,10) fmt.Println(sc) // [0 0] fmt.Println(len(sc)) // len表示切片存储元素的长度 fmt.Println(cap(sc)) // cap表示最大可以存储的容量
(3)切片的遍歷
sc:=[]int{1,2,3} //普通for循环遍历 for i:=0;i<len(sc);i++{ fmt.Println(s[i]) } //for range遍历 for index,value:=range s{ fmt.Println(index,value) }
(4)append()方法
Go語言的內建函數append()可以為切片動態加入元素。可以一次加入一個元素,可以加入多個元素,也可以加入另一個切片中的元素(後面加上…)。
var s1 []int //定义切片s1 s1 = append(s1,1) //在切片s1后面添加一个1的元素 s1 = append(s1,2,3,4) //在切片s1后面继续添加2,3,4 s2:=[]int{5,6,7} //定义切片s2 s1 = append(s1,s2) //把切片s2中的元素追加到切片s1中
(5)copy方法
Go語言內建的copy()函數可以迅速地將一個切片的資料複製到另外一個切片空間中,copy ()函數的使用格式如下:
a:=[]int{1,2,3,4,5} b:=make([]int,5,5) copy(b,a) //把a切片中的元素copy到b切片中的元素 fmt.Println(b) //[1,2,3,4,5] b[0]=1000 fmt.Println(b) // [1000,2,3,4,5]
這裡有個問題要注意的是,在實際開發中存在這樣的問題
a := []int{1, 2, 3, 4, 5} b := a fmt.Println(a) //[1 2 3 4 5] fmt.Println(b) //[1 2 3 4 5] b[0] = 1000 fmt.Println(a) //[1000 2 3 4 5] fmt.Println(b) //[1000 2 3 4 5] /* 由于切片是引用类型,所以a和b其实都指向了同一块内存地址。 修改b的同时a的值也会发生变化。 */
(6)巧妙刪除切片中的元素
Go語言中並沒有刪除切片元素的專用方法,我們可以使用切片本身的特性來刪除元素。程式碼如下:
// 从切片中删除元素 a := []int{30, 31, 32, 33, 34, 35, 36, 37} // 要删除索引为2的元素 a = append(a[:2], a[3:]...) fmt.Println(a) //[30 31 33 34 35 36 37] /* 总结一下就是:要从切片a中删除索引为index的元素, 操作方法是a = append(a[:index], a[index+1:]...) */
更多程式相關知識,請造訪:程式設計影片! !
以上是聊聊go語言中的切片(slice)的詳細內容。更多資訊請關注PHP中文網其他相關文章!