数组和切片

Go 里数组和切片都能存一组同类型数据。

实际开发中,切片更常用。

一、数组

数组长度固定。

package main

import "fmt"

func main() {
	var nums [3]int
	nums[0] = 10
	nums[1] = 20
	nums[2] = 30

	fmt.Println(nums)
}

也可以直接初始化:

nums := [3]int{10, 20, 30}

数组类型包含长度,所以 [3]int[4]int 是不同类型。

二、切片

切片长度可变,是开发中最常用的列表结构。

names := []string{"张三", "李四"}
names = append(names, "王五")

fmt.Println(names)

注意写法区别:

类型写法
数组[3]int{1, 2, 3}
切片[]int{1, 2, 3}

切片没有固定长度。

三、make 创建切片

nums := make([]int, 0, 10)
nums = append(nums, 1)
nums = append(nums, 2)

fmt.Println(nums)

make([]int, 0, 10)

参数含义
[]int切片类型
0当前长度
10容量

容量不是必须理解很深,先知道它是底层数组预留空间即可。

四、遍历切片

names := []string{"张三", "李四", "王五"}

for i, name := range names {
	fmt.Println(i, name)
}

不需要下标:

for _, name := range names {
	fmt.Println(name)
}

五、切片截取

nums := []int{10, 20, 30, 40, 50}

fmt.Println(nums[1:3]) // [20 30]
fmt.Println(nums[:2])  // [10 20]
fmt.Println(nums[2:])  // [30 40 50]

规则:

slice[start:end]

包含 start,不包含 end

六、nil 切片和空切片

var a []int        // nil 切片
b := []int{}       // 空切片
c := make([]int, 0)

它们都可以 append

a = append(a, 1)
b = append(b, 1)
c = append(c, 1)

返回 JSON 时,nil 切片可能编码成 null,空切片编码成 []。后端接口里如果希望前端总是看到数组,可以初始化为空切片。

七、切片是引用底层数组的视图

nums := []int{1, 2, 3}
other := nums
other[0] = 100

fmt.Println(nums)  // [100 2 3]
fmt.Println(other) // [100 2 3]

切片赋值不会复制所有元素,它们可能共享底层数组。

需要复制时:

src := []int{1, 2, 3}
dst := make([]int, len(src))
copy(dst, src)