首页 > 技术文章 > golang之切片

qzhc 2020-08-07 18:44 原文

可以理解为动态数组

不指定数组长度

创建

// 使用 make 创建空的整型切片
myNum := make([]int, 0)
// 使用切片字面量创建空的整型切片
myNum := []int{}
slice := array[0,3,5]
//[low,high,max]
//low:起点
//high:终点   左闭右开
    //len = high - low  长度
    //cap: max - low 容量
a := []int{1,2,3,4,5}
s := a[1:3:5]
结果:
    s = 1,2. 容量是5
// 创建一个整型切片
// 其长度和容量都是 5 个元素
slice := make([]int, 5)
// 创建一个整型切片
// 使其长度大于容量
myNum := make([]int, 5, 3)

注意,Golang 不允许创建容量小于长度的切片,当创建的切片容量小于长度时会在编译时刻报错:

panic: runtime error: index out of range

切片扩容

// 创建一个长度和容量都是 4 的整型切片
myNum := []int{10, 20, 30, 40}
// 向切片追加一个新元素
// 将新元素赋值为 50
newNum := append(myNum, 50)

当这个 append 操作完成后,newSlice 拥有一个全新的底层数组,这个数组的容量是原来的两倍:

函数 append() 会智能地处理底层数组的容量增长。在切片的容量小于 1000 个元素时,总是会成倍地增加容量。一旦元素个数超过 1000,容量的增长因子会设为 1.25,也就是会每次增加 25%的容量(随着语言的演化,这种增长算法可能会有所改变)。

遍历切片

myNum := []int{10, 20, 30, 40, 50}
// 迭代每一个元素,并显示其值
for index, value := range myNum {
    fmt.Printf("index: %d value: %d\n", index, value)
}

range 创建了每个元素的副本,而不是直接返回对该元素的引用。要想获取每个元素的地址,可以使用切片变量和索引值:

还可以用for遍历

切片拷贝

func copy(dst, src []Type) int
//它表示把切片 src 中的元素拷贝到切片 dst 中,返回值为拷贝成功的元素个数。如果 src 比 dst 长,就截断;如果 src 比 dst 短,则只拷贝 src 那部分:
num1 := []int{10, 20, 30}
num2 := make([]int, 5)
count := copy(num2, num1)
fmt.Println(count)
fmt.Println(num2)


//结果:
    3   //表示拷贝成功的元素个数
[10 20 30 0 0]

切片排序

sort.Ints(a[:])

 

正在整理笔记,如有雷同,请告知,必添加~

推荐阅读