一、什么是切片
Go語言切片是對陣列的抽象,
- Go陣列的長度不可改變,在特定場景中這樣的集合就不太適用,Go中提供了一種靈活,功能強悍的內置型別切片("動態陣列");
- 與陣列相比切片的長度是不固定的,可以追加元素,在追加時可能使切片的容量增大,
- 切片本身沒有任何資料,它們只是對現有陣列的參考,
- 切片與陣列相比,不需要設定長度,在[ ]中不用設定值,相對來說比較自由
- 從概念上面來說slice像一個結構體,這個結構體包含了三個元素:
切片的結構:
- 〇指標,指向陣列中slice指定的開始位置
- 〇長度,SPslice的長度
- 〇最大長度,也就是slice開始位置到陣列的最后位置的長度
二、切片的使用
切片的宣告

s1 := make([]int, 5) s2 := make([]int, 5, 7)
切片的初始化:

nums := []int{1, 2, 3, 4, 5}
len()和cap()函式
1、 切片的長度是切片中元素的數量,
2、 切片的容量是從創建切片的索引開始的底層陣列中元素的數量,
3、 切片是可索引的,并且可以由len()方法獲取長度,切片提供了計算容量的方 法cap(),可以測量切片最長可以達到多少,[陣列計算cap()結果與len()相同]
4、 切片實際的是獲取陣列的某一部分,len切片<=cap切片<=len陣列

package mainimport "fmt"func main() { s1 := make([]int, 5) s2 := make([]int, 5, 7) printSlice(s1) //length:5,cap=5,slice=[0 0 0 0 0] printSlice(s2) //length:5,cap=7,slice=[0 0 0 0 0] //創建切片 nums := []int{1, 2, 3, 4, 5} printSlice(nums) //從切片中截取小切片 nums1 := nums[1:4] printSlice(nums1) //length:3,cap=4,slice=[2 3 4] nums2 := nums[:3] printSlice(nums2) //length:3,cap=5,slice=[1 2 3] nums3 := nums[2:] printSlice(nums3) //length:3,cap=3,slice=[3 4 5]}func printSlice(slc []int) { fmt.Printf("length:%d,cap=%d,slice=%v \n", len(slc), cap(slc), slc)}View Code
三、切片的常用函式
(五)、append( ) 和 copy( )函式
1、函式append( ):
- •往切片中追加新元素
- •可以向 slice里面追加一個或者多個元素,也可以追加一個切片,
- • append函式會改變slice所參考的陣列的內容,從而影響到參考同一陣列的 其它slice,
- •當使用 append追加元素到切片時,如果容量不夠(也就是(cap-len)== 0),Go就會創建一個新的記憶體地址來儲存元素(該方式效率較低),
2、函式copy:*復制切片元素
- •將源切片中的元素復制到目標切片中,回傳復制的元素的個數
- • copy方法是不會建立源切片與目標切片之間的聯系,也就是兩個切片不存 在聯系,一個修改不影響另一個,

package mainimport "fmt"func main() { //創建切片 nums := []int{1, 2, 3, 4, 5} printSlice("nums", nums) //slice=nums,p=0xc00000c5d0,length:5,cap=5,slice=[1 2 3 4 5] //append 追加元素 nums = append(nums, 10) printSlice("nums", nums) //slice=nums,p=0xc000014230,length:6,cap=10,slice=[1 2 3 4 5 10] a := []int{6, 7, 8, 9} //追加陣列 nums = append(nums, a...) printSlice("nums", nums) //slice=nums,p=0xc000014230,length:10,cap=10,slice=[1 2 3 4 5 10 6 7 8 9] //洗掉第一個元素 nums = nums[1:] printSlice("nums", nums) //slice=nums,p=0xc000014238,length:9,cap=9,slice=[2 3 4 5 10 6 7 8 9] //洗掉最后一個元素 nums = nums[:len(nums)-1] printSlice("nums", nums) //slice=nums,p=0xc000014238,length:8,cap=9,slice=[2 3 4 5 10 6 7 8] //洗掉中間的元素 b := int(len(nums) / 2) nums = append(nums[:b], nums[b+1:]...) printSlice("nums", nums) //slice=nums,p=0xc000014238,length:7,cap=9,slice=[2 3 4 5 6 7 8] //切片copy nums2 := make([]int, len(nums), cap(nums)*2) //copy 的切片沒有關聯 copy(nums2, nums) printSlice("nums2", nums2) //slice=nums,p=0xc000014238,length:7,cap=9,slice=[2 3 4 5 6 7 8]}func printSlice(name string, slc []int) { fmt.Printf("slice=%v,p=%p,length:%d,cap=%d,slice=%v \n", name, slc, len(slc), cap(slc), slc)}View Code
3、使用make創建切片
package mainimport "fmt"import "strconv"func main() { str := make([]string, 0, 16) printSlice("str", str) for i := 0; i < 5; i++ { str = append(str, strconv.Itoa(i)) } printSlice("str", str)}func printSlice(name string, slc []string) { fmt.Printf("slice=%v,p=%p,length:%d,cap=%d,slice=%v \n", name, slc, len(slc), cap(slc), slc)}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/67377.html
標籤:Go
上一篇:go語言特點
下一篇:go map資料結構和原始碼詳解

