1. 什么是切片 go语言的切片是对数组的抽象
go数组的长度不可更改,在特定场景中这样的集合就不太适用,go中提供了一种灵活,功能强悍的内置类型切片(动态数组),与数组相比切片的长度是不固定的,可以追加元素,再追加时可能使切片的容量增大,比方说存放学生成绩,那学生的个数是不确定的,这样就可以用切片。
go语言中切片的内部结构包含地址、大小和容量,切片一般用于快速地操作一块数据集合,如果将数据集合比做切糕的话,切片就是你要的“那一块”,切的过程包含从哪里开始(切片的起始位置)以及切多大(切片的大小),容量可以理解为装切片的口袋大小。
切片的英文是slice
切片是数组的一个引用,因此切片是引用类型,在进行传递时,遵循引用传递的机制
切片的使用和数组类似,遍历切片、访问切片的元素和求切片长度len(slice)都一样
切片的长度是可以变化的,因此切片是一个可以动态变化的数组
切片定义的基本语法
1 2 3 var 切片名 [] 类型var a [] int
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 package mainimport "fmt" func main () { var intArr [5 ]int = [...]int {1 , 11 , 22 , 55 , 76 } slice := intArr[1 :3 ] fmt.Println("intArr=" , intArr) fmt.Println("slice的元素" , slice) fmt.Println("slice的元素的个数" , len (slice)) fmt.Println("slice的容量" , cap (slice)) fmt.Printf("slice的数据类型是%T\n" , slice) fmt.Printf("intArr[1]的地址=%p\n" , &intArr[1 ]) fmt.Printf("slice[0]的地址=%p\n" , &slice[0 ]) fmt.Println("......修改slice[1]=66......" ) slice[1 ] = 66 fmt.Println("intArr=" , intArr) fmt.Println("slice的元素" , slice) }
2. 切片的创建 第一种方式,定义一个切片,然后让切片去引用一个已经创建好的数组
1 2 3 var intArr [5 ]int = [...]int {1 , 11 , 22 , 55 , 76 } slice := intArr[1 :3 ]
第二种方式
1 2 3 4 var 切片 []type = make ([]type ,len ,[cap ])
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 package mainimport "fmt" func main () { var slice []float64 = make ([]float64 , 5 , 10 ) slice[1 ] = 10 slice[3 ] = 20 fmt.Println(slice) fmt.Println("slice的size=" , len (slice)) fmt.Println("slice的cap=" , cap (slice)) }
3. 切片的遍历 切面的遍历和数组一样,也有两种方式
第一种:常规的for循环遍历
第二种:for-range遍历切片
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 package mainimport "fmt" func main () { var arr [5 ]int = [...]int {10 , 20 , 30 , 40 , 50 } slice := arr[1 :4 ] fmt.Println(slice) for i := 0 ; i < len (slice); i++ { fmt.Printf("slice[%v]=%v\n" , i, slice[i]) } for i, v := range slice { fmt.Printf("i=%v,v=%v\n" , i, v) } }