GO語言學習:切片

切片(slice)

因爲數組的長度是不可變的 應用起來不夠靈活 所以衍生出來切片
切片的長度是可變的

切片聲明

 	var  s = []int{}
 

創建一個長度爲0的切片


	 var  s = []int{1,2,3}
 

創建一個 長度爲3的切片


	 var  s = make([]int,10)
 

使用make創建一個長度爲10的切片


	 var  s = make([]int,10,20)
 

使用make創建一個長度爲10的切片cap(容量)爲20的切片

cap(容量)

	 var  s = make([]int,2,4)
	 fmt.Println("s的長度: ",len(s))
	 fmt.Println("s的容量: ",cap(s))
 

s的長度: 2
s的容量: 4
此時S的長度爲2,容量爲4。


	var  s = make([]int,2,4)
	fmt.Println("s的長度: ",len(s))
	fmt.Println("s的容量: ",cap(s))
	s=append(s,3 )
	fmt.Println(s)
	fmt.Println("s的長度: ",len(s))
	fmt.Println("s的容量: ",cap(s))
	s=append(s,4 )
	fmt.Println(s)
	fmt.Println("s的長度: ",len(s))
	fmt.Println("s的容量: ",cap(s))
	s=append(s,5 )
	fmt.Println(s)
	fmt.Println("s的長度: ",len(s))
	fmt.Println("s的容量: ",cap(s))

輸出爲:
s的長度: 2
s的容量: 4
[0 0 3]
s的長度: 3
s的容量: 4
[0 0 3 4]
s的長度: 4
s的容量: 4
[0 0 3 4 5]
s的長度: 5
s的容量: 8
-------------------------------------------------------------------------------------------------------------------------------------
當添加的元素時 超過S的容量
此時切片會自動擴容
擴容的方式爲 當前長度 X 2
再具體的可以看看源碼

注意事項

1.因爲切片底層的擴容是 把擴容前的數組 複製到 擴容後的數組
爲效率考慮 應該在一開始設定切片的容量(夠用的容量)

切片是引用傳遞

	var  s = make([]int,2,4)
	s[0] = 1
	s[1] = 2
	fmt.Println(s)
	s2:=s
	s2[1]=100
	fmt.Println(s)

輸出
[1 2]
[1 100]
當s2的元素值發生改變時 s的元素也發生了改變
可以看出 切片是引用傳遞

	 
	var  s1 = []int{1,2,3,4,5,6}
	s2 := s1[2:4]
	fmt.Println("s1 = ",s1)
	fmt.Println("s2 = ",s2)
 	s3:=s2[:4]
 	fmt.Println("s3 = ",s3)

輸出
s1 = [1 2 3 4 5 6]
s2 = [3 4]
s3 = [3 4 5 6]
在這裏插入圖片描述
切片的底層就是一個數組,切片賦值時引用傳遞
s2 的長度雖然爲2 在對S3賦值時 因爲底層數組的原因 所以S3 = 3,4,5,6

append方法
	 
	var  s = []int{1,2,3,4,5,6}
	s= append(s,2 )
	s = append(s,3,4,5 )
	s = append(s, s...)
	

append 方法可以爲切片添加元素
可以多個也可以當個
也可以是相同類型的切片

切片的遍歷

切片的遍歷和數組的遍歷是一樣的

	for   i:=0; i <len(s);i++{
		fmt.Println(s[i])
	}
	for  i,v := range s{
		fmt.Println(i,v)
	}

因爲切片是引用傳遞 在賦值是都指向的是一個地址 所以!!COPY()
	var a = []int{1,2,3,4,5,6}
	var b =  make([]int,10,20)
	//將 a的元素拷貝到b裏
	copy(b,a)
	fmt.Println("切片a的元素:  ",a)
	fmt.Println("切片b的元素:  ",b)

	fmt.Println("切片a的地址:  ",&a[1])
	fmt.Println("切片b的地址:  ",&b[1])

輸出爲
切片a的元素: [1 2 3 4 5 6]
切片b的元素: [1 2 3 4 5 6 0 0 0 0]
切片a[1]的地址: 0xc00000c2d8
切片b[1]的地址: 0xc00010c008
可以看出 a,b元素的地址是不同的

元素的刪除

go語言中沒有對元素進行刪除的函數
但是可以利用 append()函數來實現元素刪除

	var a = []int{1,2,3,4,5,6}

	a = append(a[0:1],a[2:6]... )

	fmt.Println(a)

輸出爲:[1 3 4 5 6]
刪除了第二個元素

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章