go 切片
前言:
切片的底层是数组,是对数组一个连续片段的引用。
切片和数组的不同在于定义时:数组[]中有值,切片[]中无值
由于数组的长度不可改变,所以Go提供了一种灵活,功能强悍的内置类型切片(“动态数组”)。
切片是一个有三个字段的数据结构,这 3 个字段分别是容量(capacity)、长度(length)和指向底层数组某元素的指针
正文:
定义语法:
变量名 :=make( []type, size, [cap] ) cap 为可选参数
type 是指切片的元素类型,
size 指的是为这个类型分配多少个元素,
cap 为预分配的元素数量,cap>=len
示例1:num := make([]int, 3) //定义一个地址空间
示例2:num := make([]int, 3, 5) //定义一个地址空间,和容量
fmt.Println(num) //输出[0 0 0]
fmt.Println(len(num)) //输出长度3
fmt.Println(cap(num)) //输出容量5
示例3:不使用make定义
var num []int
num = append(num, 1) //添加元素
num = append(num, 2) //添加元素
fmt.Println(num) //输出 [1 2]
切片操作
添加元素:slice = append(slice,value)
获取长度: len(slice)
获取容量:cap(num)
切片截取: slice[i:j:k]
i 表示从 slice 的第几个元素开始切,从第0个开始
j j 控制切片的结束索引 ,切片长度为(j-i) ,到j结束,不包含j
k 控制切片的容量(k-i) k>=j 可以不加 默认就是原数组长度-i
删除元素:就是把不要的元素去掉,在拼接新的切片
num = append(num[:len(num)-4], num[4:]...) //删除第四个元素 输出:[1 2 3 5 6 7]
切片copy :
count := copy(num1, num2)
//num2会覆盖num1切片 ,返回成功的个数count
多维切片定义:
str := [][]string{
{"lampol", "11122233"},
{"liudehua", "22211133"},
{"zhangxueyou", "222333211"},
}
切片遍历:
num := []int{1, 2, 3, 4, 5, 6}
//for i 的形式
for i := 0; i < len(num); i++ {
fmt.Println(num[i])
}
//for range的形式
for i, v := range num {
fmt.Println(i, v)
}
多维切片遍历:
str := [][]string{ //定义多维数组
{"lampol", "11122233"},
{"liudehua", "22211133"},
{"zhangxueyou", "222333211"},
}
for k1, v1 := range str {
for k2, v2 := range v1 {
fmt.Println(k1, k2, v2) }
}
切片排序:
排序示例1:整型切片排序
num := []int{8, 5, 1, 9, 2, 5, 3}
//升序
//sort.Ints(num) //按照升序排列
//fmt.Println(sort.IntsAreSorted(num)) //判断是否按照升序排列 ,输出 true
//fmt.Println(num) //输出:[1 2 3 5 5 8 9]
//降序
sort.Sort(sort.Reverse(sort.IntSlice(num))) //倒序排列
fmt.Println(num) //输出 [9 8 5 5 3 2 1]
排序示例2:字符串类型切片排序
str := []string{"f", "g", "a", "d", "be"}
sort.Strings(str) //字符串排序 升序
//sort.Sort(sort.Reverse(sort.StringSlice(str))) //倒叙
fmt.Println(str) //输出 [a be d f g]
完结
但行好事,莫问前程!
本文来自博客园,作者:yangphp,转载请注明原文链接:https://www.cnblogs.com/ypeih/p/17277773.html