Go语言基础语法3|青训营笔记

29 阅读2分钟

今天我继续来总结go语言的基础语法。

slice也就是切片 简单来说,切片就是一种简化版的动态数组。数组我们都很清楚是什么,那么动态数组其实就是长度不固定的数组。因为动态数组的长度不固定,切片的长度自然也就不能是类型的组成部分了。切片相较于普通数组来说,更加的灵活,所以切片也被相当广泛的使用。

切片高效操作的要点是要降低内存分配的次数,尽量保证append操作不超出cap的容量,降低触发内存分配的次数和每次分配内存大的小。

我们先来看一下slice的定义

type SliceHeader struct{
    Data uintptr //指向底层的数组指针
    Len int      //切片长度
    

和数组一样,内置的len函数返回切片中有效元素的长度,内置的cap函数返回切片容量太小,容量必须大于或等于切片的长度。

切片可以和nil进行比较,只有当切片的底层数据指针为空时切片本身为nil,这时候切片的长度和容量信息将是无效的。如果存在切片的底层数据指针为空,但是长度和容量不为0的情况,则说明切片本身已经被损坏了。

只要是切片的底层数据指针、长度和容量没有发生变化的话,对切片的遍历、元素的读取和修改都和数组是一样的。在对切片本身赋值或参数传递时,和数组指针的操作方式类似,只是复制切片头信息(reflect.SliceHeader),并不会复制底层的数据。对于类型,和数组的最大不同是,切片的类型和长度信息无关,只要是相同类型元素构成的切片均对应相同的切片类型。

我们可以通过内置的泛型函数 append() 来向切片中增加元素。 如:

在切片尾部追加N个元素

var a []int
a = append(a,1)
a = append(a,1,2,3)
a = append(a,[]int{1,2,3}...)

在切片开头位置添加元素:

var a = []int{1,2,3}
a = append([]int{0},a...)
s = append([]int{-3,-2,-1},a...)