数组与切片

71 阅读3分钟

数组

定义数组

var intArr [3]int32

int型数组的默认值为0

数组的初始化

var intArr [3]int = [3]int{1,2,3}

var intArr = [3]int{1,2,3}

var intArr = [...]int{1,2,3}

var intArr = [...]int{1:100, 0:0, 2:200}

//类型推导
strArr := [...]string{0:"tom", 1:"jack", 2:"white"}

数组的访问

普通遍历方式

var intArr [3]int = [3]int{22, 23, 24}
for i := 0; i < 3; i++ {
   fmt.Println("i: ", i, "  value: ", intArr[i])
}

image.png

for range

var intArr [3]int = [3]int{22, 23, 24}
for index, v := range intArr {
   fmt.Println("index: ", index, "   value: ", v)
}

image.png

切片(slice)

切片是引用类型,是数组的一个引用。切片是一个可以动态变化的数组,其长度是可以变化的。 slice从底层来说就是一个数据结构

type slice struct {
    ptr *[2]int
    len int
    cap int
}

定义切片

方式一:定义一个切片,然后让切片去引用一个创建好的数组

var intArr [5]int = [...]int{1, 2, 3, 4, 5}
var slice = intArr[1:3]
fmt.Println("arr =", intArr)
fmt.Println("slice =", slice)
fmt.Println("slice len = ", len(slice))
fmt.Println("slice cap = ", cap(slice))  //切片的容量是可以动态变化的

image.png 可以看出切片里面的范围是左闭右开

方式二:通过make来创建切片

var 切片名 []type = make([]type, len, cap) // cap指定切片容量,可选
                                          //如果分配了cap,必须cap>=len
var slice []int32 = make([]int32, 5, 10)

append()函数

var a []int
a = append(a, 1) // 追加1个元素
a = append(a, 1, 2, 3) // 追加多个元素, 手写解包方式
a = append(a, []int{1,2,3}...) // 追加一个切片, 切片需要解包

不过需要注意的是,在使用 append() 函数为切片动态添加元素时,如果空间不足以容纳足够多的元素,切片就会进行“扩容”,此时新切片的长度会发生改变

除了在切片的尾部追加,我们还可以在切片的开头添加元素:

var a = []int{1,2,3}
a = append([]int{0}, a...) // 在开头添加1个元素
a = append([]int{-3,-2,-1}, a...) // 在开头添加1个切片

将另一个切片的部分数据在切片的尾部追加

var a = []int{1,2,3}
var b = []int{1,2,3,4,5,6}
a = append(a, b[3:]...) //将b后面的456解包后追加到a中
// 没有append(b[3:]..., a)的写法
// Cannot use 'b[3:]' (type []int) as the type []Type

copy():切片复制(切片拷贝)

如果加入的两个数组切片不一样大,就会按照其中较小的那个数组切片的元素个数进行复制。

copy( destSlice, srcSlice []T) int

其中 srcSlice 为数据来源切片,destSlice 为复制的目标(也就是将 srcSlice 复制到 destSlice),目标切片必须分配过空间且足够承载复制的元素个数,并且来源和目标的类型必须一致,copy() 函数的返回值表示实际发生复制的元素个数。

slice1 := []int{1, 2, 3, 4, 5}
slice2 := []int{5, 4, 3}
copy(slice2, slice1) // 只会复制slice1的前3个元素到slice2中
copy(slice1, slice2) // 只会复制slice2的3个元素到slice1的前3个位置