Go 切片(slice)使用
切片是对数组的一个连续片段的引用,所以切片是一个引用类型。切片本身不拥有任何数据,它们只是对现有数组的引用,每个切片值都会将数组作为其底层的数据结构;slice的语法与数组很像,只是没有固定的长度而已
切片的创建
-
使用 [ ]Type可以创建一个代用Type类型的切片
func test04() { //声明一个整型切片 var numList []int fmt.Println(numList) //声明一个空切片 var numListEmpty = []int{} fmt.Println(numListEmpty) }
-
可以使用make函数构造一个切片,格式为make([]Type,size,cap)
//指针:是指向第一个切片元素对应的底层数组元素的地址。(切片的一个元素不一定是数组中的第一个元素) //长度:切片中的元素个数 //容量:从切片的开始位置到底层数据的结尾位置 list :=make([]int,5,5) fmt.Println(list)
-
可以 以一个数组的某个片段创建一个切片
func test05() { arr := []string{"风之极-刮痧", "焰分-赤浪尺", "八极崩", "第九魂技", "菊花残-满地伤"} slice1 := arr[1:3] fmt.Println(slice1) //打印:[焰分-赤浪尺 八极崩](取到索引为1和2,就是开始可以取到,结尾取不到) fmt.Println(arr) //打印:[风之极-刮痧 焰分-赤浪尺 八极崩 第九魂技 菊花残-满地伤] }
-
切片的使用
func emptySlice() { var numList []int fmt.Println(numList==nil)//true fmt.Println(len(numList)==0)//true 判断切片是否为空 } func modifySlice() { arr := [...]string{"风之极-刮痧", "焰分-赤浪尺", "八极崩", "第九魂技", "菊花残-满地伤", "神罗万象"} s := arr[:] fmt.Println(arr) fmt.Println(s) fmt.Println("---------修改第一个元素之后--------") s[0] = "西漳" fmt.Println(arr) fmt.Println(s) /** 打印结果: [风之极-刮痧 焰分-赤浪尺 八极崩 第九魂技 菊花残-满地伤 神罗万象] [风之极-刮痧 焰分-赤浪尺 八极崩 第九魂技 菊花残-满地伤 神罗万象] ---------修改第一个元素之后-------- [西漳 焰分-赤浪尺 八极崩 第九魂技 菊花残-满地伤 神罗万象] [西漳 焰分-赤浪尺 八极崩 第九魂技 菊花残-满地伤 神罗万象] */ } func appendSliceData() { s := []string{"张三"} fmt.Println(cap(s)) //追加一个元素 s = append(s, "焰分-赤浪尺") fmt.Println(cap(s)) //追加两个元素 s = append(s, "八极崩 第九魂技", "菊花残-满地伤") fmt.Println(cap(s)) //追加一个切片 s = append(s, []string{"风之极-刮痧", "焰分-赤浪尺"}...) fmt.Println(cap(s))//切片容量每次会扩大原来的两倍 fmt.Println(s) /** 1 2 4 8 */ //[张三 焰分-赤浪尺 八极崩 第九魂技 菊花残-满地伤 风之极-刮痧 焰分-赤浪尺] }
-
切片的长度和容量
一个切片slice由三个部分构成:指针、长度、容量;指针指向第一个slice元素对应的底层数组元素的地址,要注意的是slice的一个元素并不一定就是数组的第一个个元素;长度对应的slice中元素的数目,长度不能超过容量,容量一般是从slice的开始位置到底层数据的结尾位置。简单的讲,容量就是从创建切片索引开始的底层数组中的元素个数,而长度是切片中的元素个数。
内置的len和cap 函数分别是slice的长度和容量