切片的運用
package main
import "fmt"
func main() {
? /*
? 數(shù)組array:
? ? 存儲一組相同數(shù)據(jù)類型的數(shù)據(jù)結(jié)構(gòu)
? ? ? 特點:定長
? 切片Slice:
? ? 同數(shù)組類似踱承,也叫做邊長數(shù)組或動態(tài)數(shù)組抽碌。
? ? ? ? 特點:變長
? ? 是一個引用類型的容器必怜,指向了一個底層數(shù)組
? make()
? ? func make(t Type,size ...IntegerType)Type
? ? 第一個參數(shù):類型
? ? ? slice,map,chan
? ? 第二個參數(shù):長度
? ? ? 實際存儲元素的數(shù)量
? ? 第三個參數(shù):容量cap
? ? ? 最多能夠存儲的元素的數(shù)量
? append():專門用于向切片的尾部追加元素
? ? sliece = append(slice,elem1,elem2)
? ? sliece = append(slice,anotherSlilce...)
? */
? //1.數(shù)組
? arr :=[4]int{1,2,3,4}//定長
? fmt.Println(arr)
? //2.切片
? var s1 []int
? fmt.Println(s1)
? s2 := []int{1,2,3,4}//變長
? fmt.Println(s2)
? fmt.Printf("%T,%T\n",arr,s2)//[4]int,[]int
? s3 :=make([]int,3,8)
? fmt.Println(s3)
? fmt.Printf("容量:%d,長度:%d\n",cap(s3),len(s3))
? s3[0] = 1
? s3[1] = 2
? s3[2] = 3
? fmt.Println(s3)
? //fmt.Println(s3[3])//panic: runtime error: index out of range [3] with length 3
? //append()
? s4 := make([]int,0,5)
? fmt.Println(s4)
? s4 = append(s4,1,2)
? fmt.Println(s4)
? s4 = append(s4,3,4,5,6,7)
? fmt.Println(s4)
? s4 = append(s4,s3...)
? fmt.Println(s4)
? //遍歷切片
? for i :=0;i <len(s4);i++{
? ? fmt.Println(s4[i])
? }
? for i,v :=range s4{
? ? fmt.Printf("%d-->%d\n",i,v)
? }
}
運行輸出:
[1 2 3 4]
[]
[1 2 3 4]
[4]int,[]int
[0 0 0]
容量:8,長度:3
[1 2 3]
[]
[1 2]
[1 2 3 4 5 6 7]
[1 2 3 4 5 6 7 1 2 3]
1
2
3
4
5
6
7
1
2
3
0-->1
1-->2
2-->3
3-->4
4-->5
5-->6
6-->7
7-->1
8-->2
9-->3
Process finished with exit code 0
切片的擴容和內(nèi)存分析
package main
import "fmt"
func main() {
? /*
? 切片slice:
? ? 1.每一個切片引用一個底層數(shù)組
? ? 2.切片本身不存儲任何數(shù)據(jù),都是這個底層數(shù)組存儲闹炉,所以修改切片也就是修改這個數(shù)組中的數(shù)組
? ? 3.當(dāng)向切片中添加數(shù)據(jù)時呵哨,如果沒有超過容量嗤攻,直接添加,如果超過容量屿愚,自動擴容(成倍增長)
? ? 4.切片一旦擴容汇跨,就是重新指向一個新的底層數(shù)組
? 擴容:
? s1:3-->6-->12-->24
? s2:4-->8-->16-->32...
? */
? s1 := []int{1,2,3}
? fmt.Println(s1)
? fmt.Printf("len:%d,cap:%d\n",len(s1),cap(s1)) //len:3,cap:3
? fmt.Printf("%p\n",s1)
? s1 = append(s1,4,5)
? fmt.Println(s1)
? fmt.Printf("len:%d,cap:%d\n",len(s1),cap(s1)) //len:5,cap:6
? fmt.Printf("%p\n",s1)
? s1 = append(s1,6,7,8)
? fmt.Println(s1)
? fmt.Printf("len:%d,cap:%d\n",len(s1),cap(s1)) //len:8,cap:12
? fmt.Printf("%p\n",s1)
? s1 = append(s1,9,10)
? fmt.Println(s1)
? fmt.Printf("len:%d,cap:%d\n",len(s1),cap(s1)) //len:10,cap:12
? fmt.Printf("%p\n",s1)
? s1 = append(s1,11,12,13,14,15)
? fmt.Println(s1)
? fmt.Printf("len:%d,cap:%d\n",len(s1),cap(s1)) //len:15,cap:24
? fmt.Printf("%p\n",s1)
}
運行輸出:
[1 2 3]
len:3,cap:3
0xc0000143c0
[1 2 3 4 5]
len:5,cap:6
0xc00000c360
[1 2 3 4 5 6 7 8]
len:8,cap:12
0xc000042060
[1 2 3 4 5 6 7 8 9 10]
len:10,cap:12
0xc000042060
[1 2 3 4 5 6 7 8 9 10 11 12 13 14 15]
len:15,cap:24
0xc000102000
Process finished with exit code 0
讀完點個贊,給我的堅持更新注入新的活力。
2022.05.16日更 70/365 天
公眾號:3天時間
往期同類文章:
GO學(xué)習(xí) 多維數(shù)組
GO學(xué)習(xí) Array類型和排序
GO學(xué)習(xí) Array
GO學(xué)習(xí) goto語句和隨機函數(shù)