前面講了變量的有關知識,這里對於其他的數據類型就不多作介紹,(和C差不多),因此重點來討論下切片。
一、切片是引用類型,這里要稍微介紹兩個概念:值類型,構造類型和引用類型
1、值類型:是一種由類型的實際值表示的數據類型。如果向一個變量分配值類型,則該變量被附以全新的值的副本,go語言的值類型包括布爾型,整型,浮點型,復數型。
2、構造類型:和c中差不多,包括數組,結構體和字符串
3、引用類型:由類型的實際值引用表示的數據類型。如果為某個變量分配一個引用類型,則該變量將應用原始值,不創建任何副本。go語言引用類型包括切片、字典和通道。
切片通常用來實現變長數組,原型定義如下:
struct Slice
{
byte *array;
unit32 len;
unit32 cap;
};
它抽象為以下三個部分:
指向被引用的底層數組的指針;切片中元素的個數;切片分配的存儲空間。
二、切片的創建和聲明
1、基於底層數組創建切片
var array1=[10]int{1,2,3,4,5,6,7,8,9,10}
var slice[]int
slice1=array1[:5]
slice2=array1[5:]
slice3=array1[:]
slice4=array1
slice5=array1[0:len(array1)]
自己添加package和import和func main將上面的代碼運行下看看效果,理解基於底層數組創建切片。
2、直接創建切片
var slice = []int{1,2,3,4,5}
3、使用make函數創建切片
var slice=make([]int,5)//創建一個有5個元素的整型切片slice,元素的初始值為0。
在使用make()函數創建切片時,還可以為切片元素預留存儲空間:
var slice=make([]int,5,10)//創建一個有5個元素的整型切片slice,元素的初始值為0,並且預留10個元素的存儲空間。
三、切片元素的訪問和遍歷
切片的訪問和數組元素的訪問一樣,通過元素下表訪問,或者使用range遍歷所有切片元素.例:
var slice=[]int{1,2,3,4,5}
for i:=0;i<=4;i++{
fmt.Println(i,slice[i])
}
for i,v:=range slice{
fmt.Println(i,slice[i])
}
四、切片的操作
1、切片元素的增加
使用append()函數向切片尾部添加新元素:
s := make([]string, 3) fmt.Println("emp:", s)
s[0] = "a" s[1] = "b" s[2] = "c"
s = append(s, "d")
s = append(s, "e", "f") fmt.Println("apd:", s)
2、切片的復制:
var slice1=[]int{1,2,3,4,5,6,7,8,9,10}
var slice2=make([]int,3,5)
var n int
n=copy(slice2,slice1)
fmt.Println(n,slice2,len(slice2),cap(slice2))
slice3:=slice[3:6]
n=copy(slice3,slice1[1:5])
fmt.Println(n,slice,slice3)
這段代碼需要讀者好好研究研究,這可以加深對slice引用的是底層數組的理解,運行的結果是:
3 [1 2 3] 3 5
3[1 2 3 2 3 4 7 8 9 10] [2 3 4]
見下圖: